web-dev-qa-db-ja.com

オブジェクトはJavaScriptのディープコピーまたはシャローコピーで配列にプッシュされますか?

かなり自明な質問です... javascriptの配列で.Push()を使用する場合、オブジェクトは配列にプッシュされますか(浅い)、実際のオブジェクト(深い)関係なく.

67
Travis J

それはあなたが押しているものに依存します。オブジェクトと配列は、元のオブジェクトへのポインタとしてプッシュされます。数値やブール値などの組み込みプリミティブ型は、コピーとしてプッシュされます。そのため、オブジェクトはどのような方法でもコピーされないため、オブジェクトの深いコピーや浅いコピーはありません。

これを示す実用的なスニペットを次に示します。

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
120
jfriend00

jfriend00はここで重要ですが、1つの小さな説明があります。それは、変数が指しているものを変更できないという意味ではありません。つまり、yは最初に配列に入れた変数を参照しますが、yという名前の変数を取得し、配列内にあるオブジェクトから切断して、y(つまりmake itreference)完全に異なるもの配列によってのみ参照されるようになったオブジェクトを変更せずに

http://jsfiddle.net/rufwork/5cNQr/6/

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

// 1.) pushes a copy
array.Push(x);
x = 5;
document.write(array[0] + "<br>");    // alerts 4 because it's a copy

// 2.) pushes a reference
array.Push(y);
y.name = "foo";

// 3.) Disconnects y and points it at a new object
y = {}; 
y.name = 'bar';
document.write(array[1].name + ' :: ' + y.name + "<br>");   
// alerts "foo :: bar" because y was a reference, but then 
// the reference was moved to a new object while the 
// reference in the array stayed the same (referencing the 
// original object)

// 4.) Uses y's original reference, stored in the array,
// to access the old object.
array[1].name = 'foobar';
document.write(array[1].name + "<br>");
// alerts "foobar" because you used the array to point to 
// the object that was initially in y.
36
ruffin