传递引用 JavaScript 对象

新手上路,请多包涵

请阅读下面代码中的注释以了解我想问的问题。

预期输出: 根据 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 许可协议

阅读 187
2 个回答

当您将一个变量赋值给另一个变量时,并不是这两个变量现在都通过引用链接在一起;您误解了“通过引用传递”在这里的含义。

持有对象的变量不会“直接”持有对象。它持有的是 _对对象的引用_。当您将该引用从一个变量分配给另一个变量时,您正在制作该引用的副本。现在这两个变量都持有一个对象的引用。通过该引用修改对象会为持有该对象引用的两个变量更改它。

当您为其中一个变量分配一个新值时,您只是在修改该变量所持有的值。该变量现在不再保存对该对象的引用,而是保存其他内容。另一个变量仍然保留对原始对象的引用,赋值根本不影响它。

原文由 deceze 发布,翻译遵循 CC BY-SA 3.0 许可协议

当你评价

objTwo = {};

Javascript 将其解释为将 objTwo 重新分配给一个新的文字空对象,并保留其旧值。

如果你想通过引用从 objOne 中删除一个键,你可以使用 delete 关键字:

 delete objTwo.x;  // also deletes the x property of objOne

原文由 Razzi Abuissa 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题