224 Stimmen

Wie kann man ein JavaScript-Objekt schnell löschen?

Mit einem JavaScript-Array kann ich es mit einer einzigen Zuweisung auf einen leeren Zustand zurücksetzen:

array.length = 0;

Dadurch erscheint das Array leer und kann wiederverwendet werden, und soweit ich weiß, handelt es sich um eine einzige "Operation", d. h. um eine konstante Zeit.

Gibt es eine ähnliche Möglichkeit, ein JS-Objekt zu löschen? Ich weiß, ich kann seine Felder durchlaufen und sie löschen:

for (var prop in obj) { if (obj.hasOwnProperty(prop)) { delete obj[prop]; } }

aber dies hat eine lineare Komplexität.

Ich kann das Objekt auch einfach wegwerfen und ein neues erstellen:

obj = {};

Aber "promiscuous" Erstellung von neuen Objekten führt zu Problemen mit Garbage Collection auf IE6. ( Wie hier beschrieben )

7voto

Martijn Punkte 12689

Um Ihre Frage zu rekapitulieren: Sie möchten Probleme mit dem IE6 GC-Bug so weit wie möglich vermeiden. Dieser Fehler hat zwei Ursachen:

  1. Garbage Collection erfolgt einmal alle paar Jahre Zuweisungen Je mehr Zuweisungen Sie also vornehmen, desto häufiger wird GC ausgeführt;
  2. Je mehr Objekte Sie "in der Luft" haben, desto mehr Zeit nimmt jeder Garbage Collection-Lauf in Anspruch (da die gesamte Liste der Objekte durchforstet wird, um zu sehen, welche als Garbage markiert sind).

Die Lösung für Ursache 1 scheint zu sein: die Anzahl der Zuweisungen gering halten; neue Objekte und Strings so wenig wie möglich zuweisen.

Die Lösung für Ursache 2 scheint zu sein: Halten Sie die Anzahl der "lebenden" Objekte niedrig; löschen Sie Ihre Strings und Objekte, sobald Sie sie nicht mehr brauchen, und erstellen Sie sie neu, wenn es nötig ist.

In gewisser Weise sind diese Lösungen widersprüchlich: Wenn die Anzahl der Objekte im Speicher gering gehalten werden soll, sind mehr Zuweisungen und Freigaben erforderlich. Umgekehrt könnte die ständige Wiederverwendung derselben Objekte bedeuten, dass mehr Objekte im Speicher gehalten werden als unbedingt erforderlich.


Nun zu Ihrer Frage. Ob Sie ein Objekt zurücksetzen, indem Sie ein neues Objekt erstellen oder alle seine Eigenschaften löschen, hängt davon ab, was Sie anschließend damit machen wollen.

Sie werden ihm wahrscheinlich neue Eigenschaften zuweisen wollen:

  • Wenn Sie dies sofort tun, empfehle ich, die neuen Eigenschaften sofort zuzuweisen und nicht erst zu löschen oder zu leeren. (Stellen Sie sicher, dass alle Eigenschaften werden jedoch entweder überschrieben oder gelöscht!)
  • Wenn das Objekt nicht sofort verwendet wird, sondern zu einem späteren Zeitpunkt neu erstellt werden soll, schlage ich vor, es zu löschen oder ihm null zuzuweisen und später ein neues zu erstellen.

Es gibt keine schnelle, einfach zu bedienende Möglichkeit, ein JScript-Objekt für die Wiederverwendung zu löschen, als wäre es ein neues Objekt - ohne ein neues zu erstellen. Das heißt, die kurze Antwort auf Ihre Frage ist "Nein", wie jthompson sagt.

4voto

Terry Thorsen Punkte 231

Etwas Neues, über das man nachdenken sollte, wenn man sich auf Object.observe in ES7 und auf die Datenbindung im Allgemeinen freut. Bedenken Sie:

var foo={
   name: "hello"
};

Object.observe(foo, function(){alert('modified');}); // bind to foo

foo={}; // You are no longer bound to foo but to an orphaned version of it
foo.name="there"; // This change will be missed by Object.observe()

Unter diesen Umständen kann also die Nummer 2 die beste Wahl sein.

4voto

Andrew Punkte 1869

Dies beunruhigt mich seit Ewigkeiten so hier ist meine Version, wie ich wollte nicht ein leeres Objekt, ich wollte ein mit allen Eigenschaften, aber auf einige Standardwerte zurückgesetzt. So ähnlich wie eine neue Instanziierung einer Klasse.

let object1 = {
  a: 'somestring',
  b: 42,
  c: true,
  d:{
    e:1,
    f:2,
    g:true,
    h:{
      i:"hello"
    }
  },
  j: [1,2,3],
  k: ["foo", "bar"],
  l:["foo",1,true],
  m:[{n:10, o:"food", p:true }, {n:11, o:"foog", p:true }],
  q:null,
  r:undefined
};

let boolDefault = false;
let stringDefault = "";
let numberDefault = 0;

console.log(object1);
//document.write("<pre>");
//document.write(JSON.stringify(object1))
//document.write("<hr />");
cleanObject(object1);
console.log(object1);
//document.write(JSON.stringify(object1));
//document.write("</pre>");

function cleanObject(o) {
  for (let [key, value] of Object.entries(o)) {
    let propType = typeof(o[key]);

    //console.log(key, value, propType);

    switch (propType) {
      case "number" :
        o[key] = numberDefault;
        break;

      case "string":
        o[key] = stringDefault;
        break;

      case "boolean":
        o[key] = boolDefault;    
        break;

      case "undefined":
        o[key] = undefined;   
        break;

      default:
        if(value === null) {
            continue;
        }

        cleanObject(o[key]);
        break;
    }
  }
}

// EXPECTED OUTPUT
// Object { a: "somestring", b: 42, c: true, d: Object { e: 1, f: 2, g: true, h: Object { i: "hello" } }, j: Array [1, 2, 3], k: Array ["foo", "bar"], l: Array ["foo", 1, true], m: Array [Object { n: 10, o: "food", p: true }, Object { n: 11, o: "foog", p: true }], q: null, r: undefined }
// Object { a: "", b: 0, c: undefined, d: Object { e: 0, f: 0, g: undefined, h: Object { i: "" } }, j: Array [0, 0, 0], k: Array ["", ""], l: Array ["", 0, undefined], m: Array [Object { n: 0, o: "", p: undefined }, Object { n: 0, o: "", p: undefined }], q: null, r: undefined }

1voto

Ven Punkte 18829

Sie können die Requisiten löschen, aber nicht die Variablen. delete abc; ist in ES5 ungültig (und führt bei use strict zu Fehlern).

Sie können es auf null zuweisen, um es für die Löschung an die GC zu setzen (es wird nicht, wenn Sie andere Verweise auf Eigenschaften haben)

Einstellung length Eigenschaft an einem Objekt ändert nichts. (es setzt nur, nun ja, die Eigenschaft)

-8voto

user670265 Punkte 469

Angenommen, Ihr Objektname ist BASKET, dann setzen Sie einfach BASKET = "";

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