如果你有一个javascript中的对象并且它引用了另一个对象,然后第二个对象发生了变化,你可以期待看到引用对象的变化。但是,如果第二个对象最初未定义,则第一个对象将永远不会反映新的更改。任何人都可以解释这段代码中发生的事情吗?
//Here we see the reference updated
var myobj = {};
var pointer = myobj;
myobj.value = 1;
console.log(pointer.value);
//Here if we start as undefined, create a reference and then allocate a new object - not so much
var myobj = undefined;
var pointer = myobj;
myobj = {}
myobj.value = 1;
console.log(pointer.value);
在
下观察到$ node --version
v0.8.22
答案 0 :(得分:2)
答案很简单。您需要了解值和引用类型变量之间的区别。
在第一个例子中有一个引用类型变量,即myObj
,它指向存储器中的一个区域。然后定义另一个变量,即pointer
,指向同一区域。这就是为什么对一个对象的任何更改立即反映在另一个对象上的原因。
在第二个例子中,情况略有不同。您定义了{未定义类型的myObj
。这意味着没有为此变量指定值。如果你有一个值类型变量,你会这样做,例如您没有要分配值的数字,字符串等;这也意味着myObj
并未指向内存堆部分中的任何内容。
然后当你这样做var pointer = myobj;你只是将一个变量的值复制到另一个变量;它类似于这样做,例如:var pointer = 5;这称为“按值复制”,这就是为什么不反映这些更改。