JavaScript オブジェクトのコピーを変更すると、元のオブジェクトが変更されます
P粉765684602
2023-08-27 18:32:45
<p><code>objA</code> を <code>objB</code></p> にコピーします。
<pre class="brush:php;toolbar:false;">const objA = { prop: 1 },
const objB = objA;
objB.prop = 2;
console.log(objA.prop); // 1 の代わりに 2 をログに記録します</pre>
<p>配列にも同じ問題があります</p>
<pre class="brush:php;toolbar:false;">const arrA = [1, 2, 3],
const arrB = arrA;
arrB.push(4);
console.log(arrA.length); // `arrA` には 3 つの要素ではなく 4 つの要素があります。
<p><br /></p>
明確にするために要約すると、JS オブジェクトをコピーするには 4 つの方法があります。
...{}
またはObject.assign()
を使用します。lodash
のようなユーティリティ ライブラリを参照するとよいでしょう。を使用すると、実際に新しいオブジェクトが作成されます。これらのプロパティはオブジェクト間で共有されます (一方を変更すると、もう一方も変更されます)。通常のコピーとの違いは、プロパティが新しいオブジェクトのプロトタイプ
__proto__に追加されることです。これは、元のオブジェクトを
決して 変更しない場合の浅いコピーとしても使用できますが、特にこの動作が必要でない限り、上記の方法のいずれかを使用することをお勧めします。明らかに、ステートメント
var tempMyObj = myObj;
の内容について誤解があります。JavaScript では、オブジェクトは参照 (より正確には参照の値) によって渡され、割り当てられるため、
tempMyObj
とmyObj
は両方とも同じオブジェクトへの参照になります。これは、何が起こっているかを視覚化するために簡略化された図です
リーリー代入後からわかるように、両方の参照が同じオブジェクトを指しています。
一方を変更する必要があり、他方は変更しない場合は、コピーを作成する必要があります。
リーリー古い回答:
オブジェクトのコピーを作成する他の方法をいくつか紹介します
すでに jQuery を使用しているため:
リーリープレーンな JavaScript を使用する
リーリーこことここを参照してください。