Mit einem JavaScript-Array kann ich es mit einer einzigen Zuweisung auf einen leeren Zustand zurücksetzen:
array.length = 0;
Dadurch wird das Array "leer" und kann wiederverwendet werden. Soweit ich weiß, handelt es sich um eine einzelne "Operation", dh eine konstante Zeit.
Gibt es eine ähnliche Möglichkeit, ein JS-Objekt zu löschen? Ich weiß, dass ich seine Felder iterieren kann, um sie zu löschen:
for (var prop in obj) { if (obj.hasOwnProperty(prop)) { delete obj[prop]; } }
Dies hat jedoch eine lineare Komplexität.
Ich kann das Objekt auch einfach wegwerfen und ein neues erstellen:
obj = {};
Die "promiskuitive" Erstellung neuer Objekte führt jedoch zu Problemen mit der Garbage Collection im IE6. ( Wie hier beschrieben )
javascript
performance
Levik
quelle
quelle
for (var prop in obj)
Antworten:
Ich denke, die kurze Antwort auf Ihre Frage lautet Nein (Sie können einfach ein neues Objekt erstellen).
In diesem Beispiel, glaube ich, bleiben beim Setzen der Länge auf 0 immer noch alle Elemente für die Speicherbereinigung übrig.
Sie können dies zu Object.prototype hinzufügen, wenn Sie es häufig verwenden. Ja, die Komplexität ist linear, aber alles, was später keine Speicherbereinigung durchführt, wird es sein.
Dies ist die beste Lösung. Ich weiß, dass es nicht mit Ihrer Frage zusammenhängt - aber wie lange müssen wir IE6 weiterhin unterstützen? Es gibt viele Kampagnen, um die Nutzung einzustellen.
Fühlen Sie sich frei, mich zu korrigieren, wenn oben etwas nicht stimmt.
quelle
Nun, auf die Gefahr hin, die Dinge zu einfach zu machen ...
... scheint ziemlich effektiv zu sein, um das Objekt in einer Codezeile mit einem Minimum an gruseligen Klammern zu bereinigen. Alle Mitglieder werden wirklich gelöscht, anstatt als Müll zurückgelassen zu werden.
Wenn Sie das Objekt selbst löschen möchten, müssen Sie natürlich noch ein separates delete () dafür ausführen.
quelle
hasOwnProperty
in dieser Schleife zu verwenden. Ich habe die Dokumente gelesen, aber ich versuche immer noch, mich mit den Risiken zu befassen, wenn überhaupt, wenn wir diehasOwnProperty()
Prüfung weglassen .ES5
ES5-Lösung kann sein:
ES6
Und ES6-Lösung kann sein:
Performance
Unabhängig von den Spezifikationen sind die schnellsten Lösungen im Allgemeinen:
Der Grund, warum
for..in
nur für flache oder einfache Objekte ausgeführt werden sollte, besteht darin, dass die prototypisch vererbten Eigenschaften durchlaufen werden und nicht nur eigene Eigenschaften, die gelöscht werden können. Falls es nicht sicher bekannt , dass ein Objekt schlicht und Eigenschaften sind zählbare,for
mitObject.getOwnPropertyNames
einer besseren Wahl ist.quelle
Sie können dies versuchen. Die folgende Funktion setzt alle Werte der Objekteigenschaften auf undefiniert. Funktioniert auch mit verschachtelten Objekten.
quelle
Um Ihre Frage noch einmal zusammenzufassen: Sie möchten Probleme mit dem IE6 GC-Fehler so weit wie möglich vermeiden. Dieser Fehler hat zwei Ursachen:
Die Lösung für Ursache 1 scheint zu sein: Halten Sie die Anzahl der Zuweisungen niedrig; Weisen Sie so wenig wie möglich neue Objekte und Zeichenfolgen zu.
Die Lösung für Ursache 2 scheint zu sein: Halten Sie die Anzahl der "lebenden" Objekte niedrig; Löschen Sie Ihre Zeichenfolgen und Objekte, sobald Sie sie nicht mehr benötigen, und erstellen Sie sie bei Bedarf erneut.
Bis zu einem gewissen Grad sind diese Lösungen widersprüchlich: Um die Anzahl der Objekte im Speicher niedrig zu halten, sind mehr Zuweisungen und Aufhebungen erforderlich. Umgekehrt kann die ständige Wiederverwendung derselben Objekte bedeuten, dass mehr Objekte im Speicher bleiben als unbedingt erforderlich.
Nun zu Ihrer Frage. Ob Sie ein Objekt zurücksetzen, indem Sie ein neues erstellen oder alle seine Eigenschaften löschen: Dies hängt davon ab, was Sie anschließend damit tun möchten.
Sie möchten ihm wahrscheinlich neue Eigenschaften zuweisen:
Es gibt keine schnelle und benutzerfreundliche Möglichkeit, ein JScript-Objekt für die Wiederverwendung zu löschen, als wäre es ein neues Objekt - ohne ein neues zu erstellen. Was bedeutet, dass die kurze Antwort auf Ihre Frage "Nein" lautet, wie jthompson sagt.
quelle
Es ist etwas Neues, sich auf Object.observe in ES7 und auf die Datenbindung im Allgemeinen zu freuen. Erwägen:
Unter diesen Umständen kann # 2 die beste Wahl sein.
quelle
obj = {}
Framework das Framework nicht über weitere Änderungen am Objekt informiert, sodass Ihre Vorlagen nicht ordnungsgemäß gerendert werden. Option 2 funktioniert jedoch ordnungsgemäß.Sie können die Requisiten löschen, aber keine Variablen.
delete abc;
ist in ES5 ungültig (und wirft bei strikter Verwendung).Sie können es null zuweisen, um es für das Löschen im GC festzulegen (dies ist nicht der Fall, wenn Sie andere Verweise auf Eigenschaften haben).
Das Festlegen der
length
Eigenschaft für ein Objekt ändert nichts. (es setzt nur die Eigenschaft fest)quelle
length
auszudrücken: Wenn Sie in einem Array (bei dem es sich um einen bestimmten Objekttyp handelt - wenn Sie mir nicht glauben, versuchen Sie es auszuführentypeof []
) den Wert 0 festlegen, wird nicht nur die Eigenschaft festgelegt, sondern auch der Inhalt des Arrays gelöscht . Siehe stackoverflow.com/questions/1232040/…window.abc
weil es in diesem Fall eine Requisite ist.Das hat mich ewig nervt, also hier ist meine Version, da ich kein leeres Objekt wollte, sondern eines mit allen Eigenschaften, aber auf einen Standardwert zurückgesetzt. Ein bisschen wie eine neue Instanziierung einer Klasse.
quelle