2017-06-18 6 views
1

ich folgendes getan:JavaScript seltsame Verhalten, wenn das Objekt gelöscht

a = {a:1}; 
b = {b:1}; 

c = [a,b] 

delete a; 

Jetzt verstehe ich nicht, warum noch zwei Objekt C: [a, b] aber wenn ich versuche zu drucken Konsole, geben sie mir: Uncaught Reference: ein nicht

definiert ist

wie Objekt scheint nicht mehr existieren, aber es gibt sie noch in der Anordnung.

Ich habe auch versucht zu drucken:

typeof a //"undefined" 

typeof c[0] //"object" 

Ich war sicher, dass ein Objekt in eine Variable durch Verweis zugewiesen, wenn zugeordnet. Scheint, dass hier das Objekt kopiert wurde?

+0

https://StackOverflow.com/Questions/37290747/Pass-by-Reference-JavascriptObjects – gauravmuk

+0

Mögliche Duplikat von [Ist JavaScript eine Pass-by-Reference- oder Pass-by-Value-Sprache?] (https://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by- Wert-Sprache) – gauravmuk

Antwort

0

Unlike what common belief suggests, the delete operator has nothing to do with directly freeing memory. Memory management is done indirectly via breaking references, see the memory management page for more details.

lesen here

Auch nach a die Referenz von a löschen wird in c gespeichert werden.

Daher wird c immer von object Typ sein.

a = {a:1}; 
 
b = {b:1}; 
 

 
c = [a,b]; 
 

 
delete a; 
 

 
console.log(c);

Der obige Code wird zurückkehren:

[ 
    { 
    "a": 1 
    }, 
    { 
    "b": 1 
    } 
] 

Aber wenn Sie delete c[0].a löschen, dann wird es die a von Array c löschen:

a = {a:1}; 
 
b = {b:1}; 
 
c = [a,b]; 
 
console.log (delete c[0].a); 
 
console.log(c);

wird der Ausgang sein:

[ 
    {}, 
    { 
    "b": 1 
    } 
] 
+0

'c' speichert keine Kopie von, sondern einen Verweis auf' a'. – str

+0

@str ja, schlechte Wortwahl. –

0

Der entfernt delete Operator eine Eigenschaft von einem Objekt.

Das heißt, wenn Sie ein Objekt haben const obj = { a: 56, b: 62 } und Sie führen delete obj.b, die b Eigenschaft entfernt wird und Objekt wird nur { a: 56 } sein.

Da Sie keine Variablen deklariert haben, arbeiten Sie implizit am Fensterobjekt. Sie sind Code entspricht:

window.a = {a:1}; 
window.b = {b:1}; 

window.c = [window.a, window.b] 

delete window.a; 

Wie Sie sehen können, müssen Sie nur einige Objekte, die dem window Objekt hinzugefügt und dann einer von ihnen löschen. Sie haben jedoch das der Eigenschaft zugewiesene Objekt nicht gelöscht.

Jedes Objekt in JavaScript wird beibehalten, bis keine Referenz mehr vorhanden ist. Hier gibt es immer noch eindeutig einen Verweis auf das Objekt, von dem Sie erwarten, dass es in dem Array gelöscht wird, das window.c zugewiesen ist, und das Objekt wird nicht zerstört.(Und denken Sie darüber nach: Was würden Sie erwarten, in dem Array zu sein, wenn das Objekt gelöscht wurde?)