3

オブジェクトを作成して配列にプッシュすると、参照または値によって格納されますか?

私は次のことが起こっているのを見ます:

var abc = { a: 10, b: 20};
var def = [];
def.push(abc);

abc.a = 100;

def[0].a; // outputs 100!

// if I do this
abc = { a: 10000, b: 20000 };

def[0].a; // still 100, no change this time

コンソールからの画像:

コンソールからの画像

記号を使って に=オブジェクトを代入すると、配列内の がabc指す参照も変わるはずですよね。上記では、値または参照によって何と呼んでいますか?abcdef

abc値を指す参照のように理解しました。記号を使用しない限り、=記号はそれを指し続けます。ガイドしてください。

4

4 に答える 4

8

何が起こっているのか見てみましょう:

var abc = { a: 10, b: 20};

新しいオブジェクトがメモリ内に作成され、変数に割り当てられますabc

var def = [];

新しい配列がメモリ内に作成され、変数に割り当てられますdef

def.push(abc);

配列内には、以前に作成されたオブジェクトへのポインターがあります。

 abc.a = 100;

 def[0].a; // outputs 100!

明らかに正しい。配列によっても参照されているオブジェクトを変更しています。

 abc = { a: 10000, b: 20000 };

再び新しいオブジェクトが作成され、それへの参照が に保存されabcます。これで、メモリ内に 2 つのオブジェクト (および配列) ができました。

 def[0].a; // still 100, no change this time

もちろん、これはまだ100です。配列ポインターは、2 番目のオブジェクトではなく、最初に作成されたオブジェクトを引き続き参照します。

于 2013-06-27T11:42:47.597 に答える
7

オブジェクトは常に参照によって渡されます。

を書き込むabc = { a: 10000, b: 20000 }と、上書きされるのは変数 です abc。これは古いオブジェクトを指していましたが、現在は新しいオブジェクトを指しています。

于 2013-06-27T11:40:16.050 に答える
0

あなたが言っcreate an objectたように、あなたは参照を扱っています。

2番目のステートメントでabc = { a: 10000, b: 20000 };実際に行ったことは、変数abcピントを新しいオブジェクトに作成し、古いオブジェクト以外のものを参照することですabc

于 2013-06-27T11:42:19.200 に答える
-3

問題の理由は、オブジェクトを配列にプッシュすると、それ自体が複製されるためです。つまり、配列にはオブジェクトのクローンがあります。したがって、オブジェクトのプロパティを変更しても何も変わりません。あなたはすでに2つのオブジェクトを持っているからです。上書きする場合は、新しい値で abc を定義した後に def[0] = abc を使用します。代入しないと値を変更できないという事実を除いて

于 2013-06-27T11:47:44.677 に答える