通过引用或值传递的变量(澄清)
variables passed by reference or by value (clarification)
这是我的示例代码:
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};
在这种情况下,foo
和bar
不再连接,因为引用现在被破坏了。
当您到达这行代码时:
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
相关文章:
- 将函数的上下文应用于javascript变量
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- 将PHP变量传递给jQuery时遇到问题
- 如何通过ajax刷新JSF填充的javascript变量
- 参数变量出现ngTable指令问题
- 通过javascript重定向html传递php变量
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 全局变量和全局对象的属性之间有什么区别吗
- 简单的JS函数.需要对变量进行澄清
- Javascript变量定义-澄清
- 澄清 JavaScript 变量范围
- 关于变量分配的澄清"var x=!0〃;
- 变量赋值中操作数的澄清
- JavaScript变量问题的澄清
- Javascript:需要澄清一个特定类型的变量声明
- javascript中嵌套函数变量作用域的澄清
- 有人能澄清我是什么错在这个尝试捕获块(未定义的变量)?(选择性捕获,JS)
- 澄清变量
- 通过引用或值传递的变量(澄清)