2016-07-30 12 views
0

funktioniert zwar durch Wege zu gehen ein Array in ein anderes zu kopieren stieß ich auf die Dokumentation für die spread operator wo seine erwähnt:Komplette Kopie Spread-Operator nicht

Komplette Kopie ein Array

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

In meinem experiments habe ich diese Methode verwendet und versucht, Array1 in Array2 zu kopieren. Als ich jedoch array1 änderte, wurde auch array2 geändert. Wenn tiefe Kopie bedeutet, dass dem neuen Array neuer Speicher zugewiesen wird, wie ist das möglich?

+0

Was ist das erwartete Ergebnis? Was versuchst du zu erreichen? – guest271314

+0

Kann nicht an meinem Ende reproduzieren. https://jsfiddle.net/jobsh093/ –

+3

MDN ist ein Wiki, [und Leute machen schlechte Bearbeitungen] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator $ compare? locale = de-US & to = 1090661 & from = 1072838) die ganze Zeit. Hier wird nicht tief kopiert, es ist nur Standardkopieren. – Bergi

Antwort

0

in Ihrem Beispiel Sie haben:

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? 

Anscheinend, wenn Sie array1[0][1] = 3; hat, beeinflusst die Veränderung beide Arrays, da der Spread-Operator nur kopiert die Verweise auf die Elemente des ursprünglichen Arrays. Doing array2 = [...array1]; wie tun array2 = [array1[0], array1[1]];, so zeigen die Array-Elemente auf die gleichen Speicherorte.

Wenn Sie eine tiefe Kopie möchten, müssen Sie wie bei JSON.stringify serialisieren/deserialisieren.

+0

bedeutet das, dass der Spread-Operator nicht tief kopiert. Bedeutet das, dass die Dokumentation falsch ist? – snow

+0

@Snow Ich kann es nicht falsch sagen. Der Titel kann ein wenig irreführend sein und ich denke, dass mehr Erklärungen erforderlich sind –

+3

@snow: Ja, MDN war falsch. Vertraue nicht alles dort - es ist nur ein Wiki. Ich habe es jetzt behoben. – Bergi