2016-05-04 16 views
-1
Kopieren

so habe ich dieses seltsame Problem in JavaScript 'Kopieren' ein Array:Ärger ein Array in JavaScript

var a = [0]; 
 
var b = a; 
 
b[0]++; 
 
alert(a); 
 
alert(b);

gibt mir als Benachrichtigungen 1 und 1 während ich 0 und 1 erwartet .

Wenn ich slice verwenden Sie das Array kopieren funktioniert:

var a = [0]; 
 
var b = a.slice(0); 
 
b[0]++; 
 
alert(a); 
 
alert(b);

Warum ist das so?

Ich konnte nichts finden, um mir dieses Problem zu erklären.

+0

Was ist nicht zu bekommen? Du hast gesagt, dass "a" und "b" dasselbe sind. Zwei "Zeiger" auf die gleiche Sache. Während Sie im zweiten Fall ein neues Ding erstellen, indem Sie das ursprüngliche Ding kopieren, haben Sie zwei Hinweise auf zwei verschiedene Dinge. –

+1

Im ersten Fall haben Sie die Referenz einer Variablen der zweiten zugewiesen, so dass der Wert in beiden erhöht wird. Im zweiten Fall hat slice eine flache Kopie des ersten Arrays erstellt, so dass Sie den gleichen Wert nicht erhöht haben. – gurvinder372

+1

In ES6 verwenden lassen b = [... a] –

Antwort

2

in Variablen gehalten Arrays sind Referenzen auf das Array im Speicher. Im Gegensatz zu einfachen Werten (wie Zahlen oder Strings) kopieren Sie Anweisungen wie arr2 = arr1 einfach den Verweis auf die Version im Speicher und nicht den "Wert" des Arrays.

slice() erstellt tatsächlich ein neues Array aus dem Teil (oder in diesem Fall alle) des Arrays, an dem es aufgerufen wird, weshalb Ihr zweites Beispiel anders funktioniert.

Im Allgemeinen, wenn Sie eine neue Kopie eines Arrays, auf dem einige Manipulation durchgeführt werden sollen, sollten Sie slice() aufrufen, um es zuerst zu kopieren.

+0

Danke! Das war genau das, wonach ich suchte. – Simon

0

Wenn Sie einer Variablen mitteilen, dass sie einer anderen Variablen zugewiesen werden soll, tun Sie etwas, das als "Verweis" bezeichnet wird, wobei beide auf dasselbe Objekt im Speicher zugreifen. In diesem Fall beeinflusst das Ändern einer Variablen die andere, da beide auf dasselbe Objekt zugreifen.

Wenn Sie das Segment teilen und zuweisen, übergeben Sie den Wert, was bedeutet, dass stattdessen der Wert gespeichert wird. In diesem Fall wird eine Änderung isoliert, da sie separate Objekte im Speicher speichern.

Lesen Sie hier für mehr: What's the difference between passing by reference vs. passing by value?

+1

Unvollständig. Was ist wenn 'a = [1, [2], 3]; b = a.Slice (0); b [1] [0] = 4; Alarm (a [1] [0]); // 4 ?? ' –

0

Sie sind nicht wirklich das Array zu kopieren, wenn Sie zuweisen a-b Sie verweisen nur a also, wenn Sie etwas auf b ändern sind Sie eigentlich auf die Quelle zu ändern a, was slice tut, ist, dass es Kopien jedes Element in einem Array zu einer neuen Instanz.