2017-05-31 3 views
3

Wenn die gleiche Objektreferenz in zwei Arrays existiert, sind die Objekte gleichwertig, und die Aktualisierung der einen wirkt sich auf die andere aus.js löschen Objektreferenz von zwei Arrays

Das Löschen des Objekts aus einem Array löscht es jedoch nicht in dem anderen.

Warum nicht?

var a1 = [ 
    {i: 0, s: 'zero'}, 
    {i: 1, s: 'one'} 
]; 

var a2 = [ 
    a1[0], 
    a1[1] 
]; 

// items point to same reference 
print(a1[0] === a2[0]); // true (equivalent) 

// updating one affects both 
a1[0].s += ' updated'; 
print(a1[0] === a2[0]); // true (still equivalent) 
print(a1[0]); // {"i":0,"s":"zero updated"} 
print(a2[0]); // {"i":0,"s":"zero updated"} 

// however, deleting one does not affect the other 
delete a1[0]; 
print(a1[0]); // undefined 
print(a2[0]); // {"i": 0, "s": "zero"} 

Interessanterweise wirkt sich das Löschen einer Eigenschaft von einer auf die andere aus.

delete a1[1].s; 
print(a1[1]); // {"i":1} 
print(a2[1]); // {"i":1} 

https://jsfiddle.net/kevincollins/4j6hj2v7/3/

+13

Sie löschen einen Verweis auf den Wert, nicht den Wert selbst. Sehen Sie es so, als würde man einer Person einen Namen zuweisen. Wenn du aufhörst, sie Chris zu nennen, verschwinden sie nicht plötzlich. – Halcyon

+2

Objekte werden anhand einer Referenz zugewiesen. Also, wenn Sie 'a1 [0]' tun, wird es seine Referenz abrufen und es in Array kopieren und wird es verwenden, um auf Wert zuzugreifen. Wenn Sie den Verweis löschen, entfernen Sie den ursprünglichen Speicherort und daher wird es in allen Variablen widergespiegelt. – Rajesh

+0

Verwenden Sie nicht 'löschen' auf Arrays. Setzen Sie den Index einfach auf "null" oder "undefiniert". – Bergi

Antwort

1

zu beantworten, warum letzte print(a2[0]); noch Shows Wert, lass uns den Code analysieren.

Ihr a1 ist ein Array und wenn Sie es mit Objekten initialisieren, wird es Objekte erstellen und deren Referenz speichern.

var a1 = [ 
    {i: 0, s: 'zero'}, // ref 1001 
    {i: 1, s: 'one'} // ref 1002 
]; 

Dieser Teil ist durch Ihre Kommentare klar, aber was passiert, wenn Sie delete a1[0] tun?

Wird das Objekt entfernt? Antwort ist Nein. Sie wird die Eigenschaft, die unter 0 gespeichert ist, in a1 entfernen und auf undefined setzen. Aber wenn Sie die Eigenschaft des Objekts löschen, das an dieser Referenz gehalten wird, wird es in beiden angezeigt: sample

Was passiert dann mit dem Objekt? Der Wert wird beibehalten und es wird Müll gesammelt, wenn niemand darauf verweist. In Ihrem Fall, da a2[0] immer noch darauf zugreift, behält es den Wert bei.

Sie können folgende sample als Referenz überprüfen.

0

Wie @Halcyon sagte, löschen Sie die Referenz, nicht das Objekt selbst. Um zu demonstrieren, betrachten Sie das folgende Beispiel:

var a = 2 
var b = [a, 2, 3, 4] 

Wenn Sie delete b[0], würden Sie nur die Referenz löschen und somit a===2. Wenn Sie jedoch den Verweis auf a über delete a löschen sind, dann wird der Wert in b würde undefined geändert werden, da die Referenz, die an dieser Stelle existiert nicht mehr verwendet wird

+1

Das ist ein bisschen, was ich erwartet habe.In diesem Beispiel wird "a" jedoch nicht gelöscht. https://jsfiddle.net/kevincollins/f30euchx/ –

+1

@KevinCollins Es ist wichtig, daran zu denken, dass Literale (Zahlen, Strings, etc.) nicht gelöscht werden können und wenn Sie eine referenzieren, können Sie sie nicht "löschen" – MayorMonty