395 Stimmen

Löschen von Objekten in JavaScript

Ich bin ein wenig verwirrt mit JavaScript's delete Betreiber. Nehmen Sie das folgende Stück Code:

var obj = {
    helloText: "Hello World!"
};

var foo = obj;

delete obj;

Nachdem dieser Code ausgeführt wurde, obj es null aber foo bezieht sich immer noch auf ein Objekt genau wie obj . Ich vermute, dass dieses Objekt dasselbe ist, das foo wies auf.

Das verwirrt mich, denn ich hatte erwartet, dass das Schreiben delete obj das Objekt gelöscht, das obj auf die im Speicher verwiesen wurde - nicht nur auf die Variable obj .

Liegt das daran, dass der Garbage Collector von JavaScript auf einer Retain/Release-Basis arbeitet, so dass, wenn ich keine anderen Variablen hätte, die auf das Objekt zeigen, es würde aus dem Gedächtnis gelöscht werden?

(Meine Tests wurden übrigens mit Safari 4 durchgeführt).

484voto

Jesse Rusak Punkte 55372

Der Löschoperator löscht nur einen Verweis, niemals ein Objekt selbst. Wenn er das Objekt selbst löschen würde, würden andere verbleibende Verweise hängen bleiben, wie bei einem C++-Löschvorgang. (Und der Zugriff auf eine von ihnen würde einen Absturz verursachen. Sie alle zu Null werden zu lassen, würde bedeuten, dass man beim Löschen zusätzliche Arbeit oder zusätzlichen Speicher für jedes Objekt benötigt).

Da Javascript garbage collected ist, brauchen Sie Objekte nicht selbst zu löschen - sie werden entfernt, wenn es keine Möglichkeit mehr gibt, auf sie zu verweisen.

Es kann sinnvoll sein, Verweise auf ein Objekt zu löschen, wenn Sie mit ihnen fertig sind, da dies dem Garbage Collector mehr Informationen darüber gibt, was zurückgewonnen werden kann. Wenn Verweise auf ein großes Objekt verbleiben, kann dies dazu führen, dass es nicht zurückgewonnen wird - selbst wenn der Rest Ihres Programms dieses Objekt nicht wirklich verwendet.

169voto

Guffa Punkte 663241

En delete hat keine Auswirkungen auf reguläre Variablen, sondern nur auf Eigenschaften. Nach dem delete Befehl hat die Eigenschaft nicht den Wert null gibt es überhaupt nicht.

Wenn die Eigenschaft ein Objektverweis ist, wird die delete Befehl löscht die Eigenschaft, aber nicht das Objekt. Der Garbage Collector kümmert sich um das Objekt, wenn es keine weiteren Verweise darauf gibt.

Beispiel:

var x = new Object();
x.y = 42;

alert(x.y); // shows '42'

delete x; // no effect
alert(x.y); // still shows '42'

delete x.y; // deletes the property
alert(x.y); // shows 'undefined'

(Getestet in Firefox.)

58voto

Alex Punkte 571

"Implizit deklarierte Variablen" sind Eigenschaften des globalen Objekts, so dass das Löschen für sie wie für jede andere Eigenschaft funktioniert. Mit var deklarierte Variablen sind unzerstörbar.

24voto

David Ackerman Punkte 12139

Aus der Mozilla-Dokumentation: "Sie können den delete-Operator verwenden, um implizit deklarierte Variablen zu löschen, nicht aber solche, die mit der var-Anweisung deklariert wurden. "

Hier ist der Link: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:Operators:Special_Operators:delete_Operator

6voto

Umair Ahmed Punkte 6837

delete wird nicht zum Löschen eines Objekts in Java Script verwendet.

delete zum Entfernen eines object key in Ihrem Fall

var obj = { helloText: "Hello World!" }; 
var foo = obj;
delete obj;

Objekt wird nicht gelöscht prüfen, ob obj noch dieselben Werte annimmt Verwendung löschen:

delete obj.helloText

und prüfen Sie dann obj, foo , beide sind leere Objekte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X