var list = [{name: 'foo'}, {name: 'bar'}];
var x = list[0];
x.name = 'baz'; // Changes name in list[0]
x = {name: 'baz'} // Doesn't change name in list[0] - PROBLEM
似乎第4行正在创建一个新变量。如何告诉JavaScript使用第2行中创建的现有变量x?
最佳答案
变量x
保存对对象的引用。x.name = ...
更改x
引用的特定对象的属性。x = { ... }
更改x
引用的对象。
设置如下:
x ==> { old object } <== list[0]
当您执行
x = { .. }
时,会发生以下情况:x ==> { brand new object }
{ old object } <== list[0]
但您希望它执行此操作(请注意:这永远不会发生):
x ==> { brand new object } <== list[0]
{ old object } // referred to by no one! (will be garbage collected on the next sweep)
看来您想让语句
x = { ... }
完全用新对象替换以前引用的x
对象。你不能JavaScript没有任何机制允许这种替换。无法像我的第二个示例一样“替换”对象。您需要手动更改每个参考。相反,如果要更改
list
的第一个元素,则需要直接在数组上进行替换。即,必须更改list[0] = { ... }
后再执行list[0] = x
或x
。