1. ホーム
  2. javascript

[解決済み] javascriptで配列にプッシュされたオブジェクトは、ディープコピーかシャローコピーか?

2023-07-11 16:24:40

質問

かなり自明な質問ですが、javascript で配列に対して .push() を使用する場合、配列に押し込まれるオブジェクトはポインタ (浅い) か、実際のオブジェクト (深い) ですか? にかかわらず のタイプに関係なく。

どのように解決するのですか?

何をプッシュするかによって異なります。 オブジェクトや配列は、元のオブジェクトへのポインタとしてプッシュされます。 数値やブール値のような組み込みのプリミティブ型は、コピーとしてプッシュされます。 オブジェクトはコピーされないので、ディープコピーもシャローコピーもありません。

以下は、それを示す動作中のスニペットです。

var array = [];
var x = 4;
let y = {name: "test", type: "data", data: "2-27-2009"};

// primitive value pushes a copy of the value 4
array.push(x);                // push value of 4
x = 5;                        // change x to 5
console.log(array[0]);        // array still contains 4 because it's a copy

// object reference pushes a reference
array.push(y);                // put object y reference into the array
y.name = "foo";               // change y.name property
console.log(array[1].name);   // logs changed value "foo" because it's a reference    

// object reference pushes a reference but object can still be referred to even though original variable is no longer within scope
if (true) {
    let z = {name: "test", type: "data", data: "2-28-2019"};
    array.push(z);
}

console.log(array[2].name);   // log shows value "test" since the pointer reference via the array is still within scope