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 に指示する方法は?
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 に指示する方法は?
変数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
.
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'}