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 行目で新しい変数を作成しているようです。2 行目で作成された既存の変数 x を使用するように JavaScript に指示する方法は?

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 には、この種の置換を可能にするメカニズムがありません。2 番目の例のように、オブジェクトを「置き換える」ことはできません。各参照を手動で変更する必要があります。

代わりに、 の最初の要素を変更する場合は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 に答える