1. ホーム
  2. javascript

[解決済み] JavaScript で配列を変更すると、なぜ配列のコピーに影響を与えるのですか?

2023-01-28 23:04:41

質問

以下のようなJavaScriptを書きました。

var myArray = ['a', 'b', 'c'];
var copyOfMyArray = myArray;
copyOfMyArray.splice(0, 1);
alert(myArray); // alerts ['b','c']
alert(copyOfMyArray); // alerts ['b','c']

var myNumber = 5;
var copyOfMyNumber = myNumber;
copyOfMyNumber = copyOfMyNumber - 1;
alert(myNumber); // alerts 5
alert(copyOfMyNumber); // alerts 4        

このコードでは、変数 myArray を宣言し、配列の値をセットしています。 次に、2番目の変数 copyOfMyArray を宣言し、それを myArray . に対して操作を行います。 copyOfMyArray に対して操作を行ない、次に両方の myArraycopyOfMyArray . どういうわけか、私が copyOfMyArray に対して操作を行なうと、同じ操作が myArray .

このコードでは、同じことを数値の値で行っています。 変数 myNumber を宣言し、それに数値の値を設定します。 次に、2番目の変数 copyOfMyNumber を宣言し、それを myNumber . に対して操作を行います。 copyOfMyNumber に対して操作を行ない、次に両方の myNumbercopyOfMyNumber . ここで、期待された動作が得られます。 myNumbercopyOfMyNumber .

JavaScriptで配列を変更すると配列のコピーの値が変わり、数値を変更すると数値のコピーの値は変わらないようですが、配列と数値の違いは何でしょうか?

何らかの理由で、配列は参照で、数値は値で参照されていると推測していますが、なぜでしょうか? 他のオブジェクトでどのような動作を期待すればよいのか、どうすればわかるのでしょうか。

どのように解決すればよいのでしょうか?

JavaScriptにおける配列は オブジェクトです。 を保持し、変数には 参照 を保持するだけで、オブジェクトそのものを保持するわけではありません。したがって、両方の変数が持つ参照は 同じ オブジェクトへの参照を持ちます。

数字の例との比較は正しくありません。新しい値を copyOfMyNumber . に新しい値を代入すると copyOfMyArray に新しい値を代入しても myArray も変わりません。

配列のコピーを作成するには slice [ドキュメント] (docs) :

var copyOfMyArray = myArray.slice(0);

しかし、これは 浅い コピー、つまり配列の中のオブジェクトは複製されないことに注意してください。