javascript原语vs对象引用

时间:2017-08-21 13:36:49

标签: javascript variables object reference primitive

我已经使用JavaScript多年了,这个让我难过。据我所知,在定义var时,会发生以下两种情况之一:

  1. 如果表达式是基元,则var被定义为该基元的新实例,不会引用传递的表达式。
  2. 如果表达式是对象文字,则会创建一个新对象。
  3. 如果表达式是现有对象,var将引用该对象,并且将反映对象的任何未来更改。
  4. 但是,我遇到了案例3不适用的情况:

    var obj = {body: {'a': 1, 'b': 2, 'c': 3}};
    
    var ref = obj.body;
    ref = JSON.stringify(ref);
    
    console.log(typeof ref); // string
    console.log(typeof obj.body); // object
    

    由于ref被定义为body的{​​{1}}属性,我认为将obj重新定义为字符串也会影响ref。那我错过了什么?

3 个答案:

答案 0 :(得分:2)

JSON.stringify是一个接受对象并返回其字符串表示的方法,它不会改变任何东西。通过执行ref = x,您ref指向另一个事物,它不会影响分配前的内容。

答案 1 :(得分:0)

这只是意味着,您不再引用obj.body。身体并引用其他内容。

var ref = obj.body; 

//ref holding obj.body now any changes to ref will effect obj.body.

ref = JSON.stringify(ref);

//ref holding a String returned by `stringify()` now any changes to ref will effect obj.body.
你知道吗?您只需使用不同的值更改ref即可。并没有真正改变obj

上的任何内容

答案 2 :(得分:0)

原语是不可改变的。如果与对象相比它们的行为方式存在差异,那么你就无法观察到它,所以忘掉所有关于复制的东西。让我们谈谈“事物”!对象和原语都是事物。将事物分配给变量时,您不会复制该事物。

var x = literally any value;
var y = x;

xy都是包含相同内容的变量。如果你改变了这个东西,将来你从哪里访问它并不重要;事情发生了变化。如果更改变量包含的内容,则之前包含的内容不会受到影响。

var z = some other value;
y = z;  // y now contains the same thing as z instead of the same thing as x
        // only variables changed, and the things did not

有很多答案用其他术语来讨论这个问题,但我喜欢技术语言。

tl; dr :出于所有意图和目的,JavaScript中对象和基元之间的区别并不是很有用。

ts; iwrse This article about Python同样适用于JavaScript。