Ich bin ein bisschen verwirrt mit dem JavaScript- delete
Operator. Nehmen Sie den folgenden Code:
var obj = {
helloText: "Hello World!"
};
var foo = obj;
delete obj;
Nachdem dieser Code ausgeführt wurde, obj
ist null
, foo
bezieht sich aber immer noch auf ein Objekt genau wie obj
. Ich vermute, dieses Objekt ist das gleiche Objekt, foo
auf das gezeigt wurde.
Das verwirrt mich, weil ich erwartet habe, dass beim Schreiben delete obj
das Objekt gelöscht wird, obj
auf das im Speicher verwiesen wird - nicht nur die Variable obj
.
Ist das , weil von JavaScript Garbage Collector arbeitet an einer behalten / Release - Basis, so dass , wenn ich keine andere Variablen habe auf das Objekt zeigen, es würde aus dem Speicher entfernt werden?
(Meine Tests wurden übrigens in Safari 4 durchgeführt.)
javascript
pointers
object
memory-management
garbage-collection
Steve Harrison
quelle
quelle
var obj = { helloText: "Hello World!" }; var foo = obj; delete obj;
Objekt wird nicht gelöscht überprüfenobj
löschen Verwendung:delete obj.helloText
und dann überprüfenfoo now foo is an empty object
delete
ist nicht für Objekte in Javascript zu löschen.delete
Verwendet wird , einen Objektschlüssel zum Entfernen In Ihrem Fall.var obj = { helloText: "Hello World!" }; var foo = obj; delete obj;
, Wird das Objekt nicht gelöscht wird , überprüfen. Alsobj
nächstes laufen.delete obj.helloText
Und Sie können sehen , dassfoo
nun auf ein leeres Objekt. "" "Antworten:
Der Löschoperator löscht nur eine Referenz, niemals ein Objekt selbst. Wenn das Objekt selbst gelöscht würde, würden andere verbleibende Referenzen baumeln, wie z. B. ein C ++ - Löschvorgang. (Und der Zugriff auf eines von ihnen würde einen Absturz verursachen. Wenn sie alle null werden, bedeutet dies zusätzliche Arbeit beim Löschen oder zusätzlichen Speicher für jedes Objekt.)
Da es sich bei Javascript um Müll handelt, müssen Sie Objekte nicht selbst löschen. Sie werden entfernt, wenn keine Möglichkeit mehr besteht, auf sie zu verweisen.
Es kann nützlich sein, Verweise auf ein Objekt zu löschen, wenn Sie damit fertig sind, da dies dem Garbage Collector mehr Informationen darüber gibt, was zurückgefordert werden kann. Wenn Verweise auf ein großes Objekt verbleiben, kann dies dazu führen, dass es nicht zurückgefordert wird - auch wenn der Rest Ihres Programms dieses Objekt nicht tatsächlich verwendet.
quelle
delete
Schlüsselwort funktioniert nur für Eigenschaften eines Objekts, nicht für Variablen. perfektionkills.com/understanding-deletevar obj = {a: {}}; delete obj.a;
window
?var
)Der
delete
Befehl hat keine Auswirkung auf reguläre Variablen, nur auf Eigenschaften. Nach demdelete
Befehl hat die Eigenschaft nicht den Wertnull
, sie existiert überhaupt nicht.Wenn die Eigenschaft eine Objektreferenz ist,
delete
löscht der Befehl die Eigenschaft, nicht jedoch das Objekt. Der Garbage Collector kümmert sich um das Objekt, wenn er keine weiteren Verweise darauf hat.Beispiel:
(In Firefox getestet.)
quelle
x
Variable nur eine Eigenschaft des globalenwindow
Objekts unddelete x;
entfernt diex
Variable tatsächlich vollständig.x
in einigen Browsern keine richtige Variable, sondern eine Eigenschaft imwindow
Objekt. Dies ist natürlich ein Problem mit der Konsole und spiegelt nicht wider, wie Code normalerweise ausgeführt wird."implizit deklarierte Variablen" sind Eigenschaften des globalen Objekts. Löschen funktioniert also mit ihnen wie mit jeder Eigenschaft. Mit var deklarierte Variablen sind unzerstörbar.
quelle
let
.Aus der Mozilla-Dokumentation: "Sie können den Löschoperator verwenden, um implizit deklarierte Variablen zu löschen, nicht jedoch diejenigen, 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
quelle
delete
wird nicht zum Löschen eines Objekts in Java Script verwendet.delete
wird zum Entfernen einesobject key
in Ihrem Fall verwendetObjekt wird nicht gelöscht check obj nimmt immer noch die gleichen Werte an Verwendung löschen:
und dann überprüfen
obj, foo
, ob beide leere Objekte sind.quelle
Ich habe gerade einen JSperf gefunden, den Sie angesichts dieser Angelegenheit vielleicht interessant finden. (Es könnte praktisch sein, es aufzubewahren, um das Bild zu vervollständigen.)
Es vergleicht Löschen , Setzen von Null und Setzen von Undefiniert .
Beachten Sie jedoch, dass der Fall getestet wird, wenn Sie Eigenschaften mehrmals löschen / festlegen.
quelle
Abgesehen von den GC-Fragen sollte man für 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 besser zu sein, die Referenz auf Null zu setzen, als sie zu löschen, da dies die von Chrome verwendete "Klasse" hinter den Kulissen ändern kann.
quelle
IE 5 bis 8 haben einen Fehler, bei dem die Verwendung von "Löschen" für Eigenschaften eines Hostobjekts (Fenster, Global, DOM usw.) TypeError auslöst "Objekt unterstützt diese Aktion nicht".
Später, wenn Sie überprüfen müssen, wo die Eigenschaft eine Bedeutung hat, verwenden Sie den vollen Wert,
el.foo !== undefined
da"foo" in el
im IE immer true zurückgegeben wird.Wenn Sie die Immobilie wirklich brauchen, um wirklich zu verschwinden ...
Wenn Sie das Host-Objekt mit der Host-API verwenden müssen ...
quelle
Ich bin bei meiner Suche nach derselben Antwort auf diesen Artikel gestoßen. Am Ende habe ich einfach
obj.pop()
alle in meinem Objekt gespeicherten Werte / Objekte entfernt, damit ich das Objekt wiederverwenden kann. Ich bin mir nicht sicher, ob dies eine schlechte Praxis ist oder nicht. Diese Technik hat sich für mich als nützlich erwiesen, um meinen Code in Chrome Dev-Tools oder in der FireFox-Webkonsole zu testen.quelle
Diese Arbeit für mich, obwohl es keine gute Praxis ist. Es werden einfach alle zugehörigen Elemente gelöscht, zu denen das Objekt gehört.
quelle
Durch Festlegen einer Variablen
null
wird sichergestellt, dass Verweise auf Objekte in allen Browsern unterbrochen werden, einschließlich Zirkelverweisen zwischen den DOM-Elementen und den Javascript-Bereichen. Mit demdelete
Befehl markieren wir Objekte, die beim nächsten Durchlauf der Garbage-Auflistung gelöscht werden sollen. Wenn jedoch mehrere Variablen auf dasselbe Objekt verweisen, wird durch Löschen einer einzelnen Variablen das Objekt NICHT freigegeben, sondern nur die Verknüpfung zwischen dieser Variablen und entfernt das Objekt. Beim nächsten Durchlauf der Garbage Collection wird nur die Variable bereinigt.quelle