2016-07-30 9 views
0

動作しない私は、その言及spread operatorのドキュメント間に来た:ディープコピーが

ディープコピー配列

var arr = [1,2,3]; 
var arr2 = [...arr]; 
arr2.push(4); // 'arr2' becomes [1,2,3,4]; 'arr' stays unaffected 

私のexperimentsでは、このメソッドを使用して、array1をarray2にコピーしようとしました。しかし、私はarray1を変更すると、array2も同様に変更されました。ディープコピーとは、新しい配列に新しいメモリが割り当てられたことを意味しますが、これはどのように可能ですか?あなたの例では

+0

期待される結果は?あなたは何を達成しようとしていますか? – guest271314

+0

私の最後には再生できません。 https://jsfiddle.net/jobsh093/ –

+3

MDNはwikiです。[人々は悪い編集をしています](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator $は?ロケール= en-US&to = 1090661&from = 1072838)常に表示されます。ここにはディープコピーは含まれていません。スタンダードコピーです。 – Bergi

答えて

0

あなたがやった:あなたがarray1[0][1] = 3;をしたとき

array1 = [[1,2], [4]]; 
array2 = [...array1]; 
array3 = array1.slice(); 
array4 = JSON.parse(JSON.stringify(array1)); 
array1[0][1] = 3; 
console.log(array1); 
console.log(array2); // changed array1, changes reflected in array2 deep copy where art' though? 

はどうやら、変更が広がりオペレータためだけコピー元の配列の要素への参照を両方の配列に影響を与えました。 array2 = [...array1];を実行するのはarray2 = [array1[0], array1[1]];なので、配列要素は同じメモリ位置を指します。

ディープコピーが必要な場合は、JSON.stringifyを使用したときと同じように、シリアル化/デシリアライズする必要があります。

+0

これは、スプレッドオペレータがディープコピーではないことを意味します。それはドキュメントが間違っていることを意味しますか? – snow

+0

@snow私は間違って言うことはできません。タイトルは少し誤解を招くかもしれないし、もっと説明が必要だと思う。 –

+3

@snow:はい、MDNが間違っていました。そこにあるすべてを信用しないでください。それは単なるwikiです。私は今それを修正しました。 – Bergi

関連する問題