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?
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
。
x 不是指向列表中第一个元素的指针。因此,当它被更改时,它不会影响列表中的第一个元素。如果你想改变它,你需要明确地这样做:
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
list[0] = x; // now list[0] is {name: 'baz'}
// you are creating an array of two objects
var list = [{name: 'foo'}, {name: 'bar'}];
//assigning the first obj to a variable
var x = list[0];
//changing the property 'name' of the object held in variable x
x.name = 'baz'; //--Changes name in list[0]--(no it doesn't!!!, it only changes the property of the object held in variable x!, not the one in the array)
//now you are assigning a new object to that variable!!!
x = {name: 'baz'}