请阅读下面代码中的注释以了解我想问的问题。
预期输出: 根据 JavaScript {}
的引用传递机制, objOne
预计将记录 {}
最后,因为 objTwo
已初始化 ---
。
var objOne = {
x: 1,
y: 2
};
var objTwo = objOne;
// change the x vlaue to 2 by objTwo
objTwo.x = 2;
// Change the value of key x in objOne as well - pass by reference mechanism
console.log(objOne); // { x: 2, y: 2 }
/*** Pass by reference is understood in code, above this comment ***/
// Now what if objTwo initialized with empty object
objTwo = {};
console.log(objOne); // { x: 2, y: 2 } but expected output = {}
// As per pass by reference mechanism. objOne is expected to log {}, because objTwo was initialized with {}.
原文由 Abhay 发布,翻译遵循 CC BY-SA 4.0 许可协议
当您将一个变量赋值给另一个变量时,并不是这两个变量现在都通过引用链接在一起;您误解了“通过引用传递”在这里的含义。
持有对象的变量不会“直接”持有对象。它持有的是 _对对象的引用_。当您将该引用从一个变量分配给另一个变量时,您正在制作该引用的副本。现在这两个变量都持有一个对象的引用。通过该引用修改对象会为持有该对象引用的两个变量更改它。
当您为其中一个变量分配一个新值时,您只是在修改该变量所持有的值。该变量现在不再保存对该对象的引用,而是保存其他内容。另一个变量仍然保留对原始对象的引用,赋值根本不影响它。