通过引用或值传递的变量(澄清)

时间:2015-05-25 08:11:22

标签: javascript

这是我的示例代码:

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。 我的期望有什么问题?我想我在这里错过了一个重要的教训。

5 个答案:

答案 0 :(得分:1)

您最初将foo设置为一个对象:

var foo = {a : 1};

然后用全新的对象覆盖它:

foo = {a : 10};

在这种情况下,foobar不再连接,因为现在引用已被破坏。

答案 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