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).

2voto

sksizer Punkte 221

Abgesehen von den GC-Fragen sollte man im Hinblick auf die Leistung die Optimierungen berücksichtigen, die der Browser möglicherweise im Hintergrund vornimmt.

http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/

Es scheint, dass es besser ist, den Verweis auf Null zu setzen, als ihn zu löschen, da sich dadurch die von Chrome verwendete "Klasse" im Hintergrund ändern kann.

2voto

Pedro Justo Punkte 3679

Das Setzen einer Variablen auf null stellt sicher, dass alle Verweise auf Objekte in allen Browsern unterbrochen werden, einschließlich zirkulärer Verweise, die zwischen DOM-Elementen und Javascript-Scopes gemacht werden. Durch die Verwendung von delete Wenn es jedoch mehrere Variablen gibt, die auf dasselbe Objekt verweisen, wird durch das Löschen einer einzelnen Variablen das Objekt NICHT freigegeben, sondern nur die Verknüpfung zwischen dieser Variablen und dem Objekt aufgehoben. Beim nächsten Durchlauf der Garbage Collection wird dann nur die Variable gelöscht.

2voto

garek Punkte 361

Ich habe gerade eine jsperf die für Sie in diesem Zusammenhang interessant sein könnten. (es könnte praktisch sein, sie zur Vervollständigung des Bildes aufzubewahren)

Sie vergleicht löschen Einstellung null und Einstellung undefiniert .

Aber denken Sie daran, dass es den Fall testet, wenn Sie Eigenschaft viele Male löschen/setzen.

1voto

johndhutcheson Punkte 11

IE 5 bis 8 hat einen Fehler, bei dem das Löschen von Eigenschaften eines Host-Objekts (Window, Global, DOM usw.) einen TypeError "object does not support this action" auslöst.

var el=document.getElementById("anElementId");
el.foo = {bar:"baz"};
try{
    delete el.foo;
}catch(){
    //alert("Curses, drats and double double damn!");
    el.foo=undefined; // a work around
}

Wenn Sie später prüfen müssen, ob die Eigenschaft einen bedeutungsvollen vollen Wert hat, verwenden Sie el.foo !== undefined denn "foo" in el wird im IE immer true zurückgeben.

Wenn Sie die Immobilie wirklich brauchen, um zu verschwinden...

function hostProxy(host){
    if(host===null || host===undefined) return host;
    if(!"_hostProxy" in host){
       host._hostproxy={_host:host,prototype:host};
    }
    return host._hostproxy;
}
var el=hostProxy(document.getElementById("anElementId"));
el.foo = {bar:"baz"};

delete el.foo; // removing property if a non-host object

wenn Sie das Host-Objekt mit der Host-Api verwenden müssen...

el.parent.removeChild(el._host);

1voto

Craig London Punkte 641

Auf der Suche nach der gleichen Antwort bin ich über diesen Artikel gestolpert. Was ich am Ende tat, ist einfach herausspringen obj.pop() alle gespeicherten Werte/Objekte in meinem Objekt, damit ich das Objekt wiederverwenden kann. Ich bin mir nicht sicher, ob dies eine schlechte Praxis ist oder nicht. Diese Technik erwies sich als nützlich, wenn ich meinen Code in Chrome Dev Tools oder FireFox Web Console testen wollte.

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