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] = xx

10-05 21:05
查看更多