1
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?

4

3 回答 3

4

该变量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

于 2013-08-21T17:13:19.413 回答
1

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'}
于 2013-08-21T17:09:15.067 回答
1
// 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'}
于 2013-08-21T17:10:31.733 回答