这是我的示例代码:
var foo = {a : 1};
var bar = foo;
console.log(bar.a);//1, as expected
foo.a = 2;
console.log(bar.a);//2, as expected, as objects are passed by reference
foo = {a : 10};
console.log(bar.a);//2, not expected, I expected 10
最后一个日志没有给出预期的结果。
认为foo = {a : value}
与foo.a = value
相同我认为最后的结果是10。
我的期望有什么问题?我想我在这里错过了一个重要的教训。
答案 0 :(得分:1)
您最初将foo
设置为一个对象:
var foo = {a : 1};
然后用全新的对象覆盖它:
foo = {a : 10};
在这种情况下,foo
和bar
不再连接,因为现在引用已被破坏。
答案 1 :(得分:0)
当你到达这行代码时:
foo = {a : 10};
为foo分配了一个新变量;从这一点上foo和bar是两个不同的变量,因此最后一行打印2作为bar仍然指向旧值。
答案 2 :(得分:0)
您将foo
重新分配给第2行到最后一行的新对象文字。
Bar
仍指向旧对象,因此您获得2(您在第4行修改)。
如果该解释没有解决问题,那么退一步尝试理解更高层次的变量,对象和引用可能会有所帮助。 Eloquent JavaScript的数据结构章节可能是一个很好的起点。
编辑:值得澄清的一点是:了解你并不重写任何事情很重要,你刚刚更改了foo
的参考资料。他们现在指向记忆中的不同事物。这就是为什么bar
是相同的。
答案 3 :(得分:0)
var foo = {a : 1}; //foo refering to object {a : 1}
var bar = foo; //bar refering to same object as foo
console.log(bar.a); //1, as expected
foo.a = 2; //The object to which bar and foo are pointing gets changed
console.log(bar.a); //2, as expected, as objects are passed by reference
foo = {a : 10}; //foo starts pointing to the newly created object, whereas bar is still refering the old object(no change in bar) and the earlier object `{a : 1}` exists and poinyted to by bar
console.log(bar.a); //2, not expected, I expected 10 //hence this result
答案 4 :(得分:0)
首先你将foo指定为bar,然后将foo的ref发送到bar。
现在如果更改值bar.a则会更改foo
foo = {
a: 2
}
bar = foo
console.log(bar.a) //gives 2
bar.a = 30
console.log(foo.a) //gives 30
但是当你覆盖foo时,连接将会丢失并且两者都像2个单独的变量
所以现在
foo.a = 20
console.log(bar.a) //gives 30
console.log(foo.a) //gives 20