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

variables passed by reference or by value (clarification)

本文关键字:变量 澄清 引用 值传      更新时间:2023-09-26

这是我的示例代码:

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

初始设置foo为一个对象:

var foo = {a : 1};

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

foo = {a : 10};

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

当您到达这行代码时:

foo = {a : 10};

foo被赋值一个new变量;从这里开始,foo和bar是两个不同的变量,由于这个原因,最后一行输出2,因为bar仍然指向旧的值。

您正在将foo重新分配给第2至最后一行的新对象文字。Bar仍然指向旧对象,因此您得到2(您在第4行修改了它)。

如果这个解释不能澄清问题,那么退一步,尝试在更高的层次上理解变量、对象和引用可能会有所帮助。雄辩JavaScript的数据结构章节可能是一个很好的开始。

有一点值得澄清:重要的是要明白你没有覆盖任何东西,你只是改变了foo的引用。它们现在指向记忆中的不同事物。这就是为什么bar是相同的
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

首先将foo赋值给bar,然后将foo的ref值发送给bar。

现在,如果你改变值栏。A然后foo将被更改

foo = {
    a: 2
}
bar = foo
console.log(bar.a) //gives 2
bar.a = 30
console.log(foo.a) //gives 30

但是当您覆盖foo时,连接将丢失,并且两者都像两个单独的变量

现在
foo.a = 20
console.log(bar.a) //gives 30
console.log(foo.a) //gives 20