Signatur
Beschreibung
Die Methode delete() entfernt einen Wert aus einem WeakSet. Ein WeakSet enthält nur Objekte (seit ES2023 auch nicht registrierte Symbole) und hält sie schwach: Gibt es sonst keine Referenz mehr auf ein Objekt, kann die Speicherbereinigung es entfernen, auch wenn es noch im Set steht.
Typischerweise nutzt man delete(), um eine Markierung wieder zu entfernen, zum Beispiel „dieses DOM-Element wurde bereits initialisiert“, „dieses Objekt wird gerade bearbeitet“ oder „dieses Objekt ist gesperrt“. Die Markierung hängt am Objekt, ohne es selbst zu verändern.
Der Rückgabewert zeigt an, ob tatsächlich etwas entfernt wurde. Wird ein Wert übergeben, der kein Objekt ist, wirft die Methode keinen Fehler, sondern gibt einfach false zurück. Das ist anders als bei add(), das in diesem Fall einen TypeError wirft.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $value Pflicht | object | symbol | Der Wert, der aus dem WeakSet entfernt werden soll. Verglichen wird die Identität (Referenz), nicht der Inhalt. |
Rückgabewert
true, wenn der Wert im WeakSet war und entfernt wurde; sonst false, auch wenn value kein Objekt ist.Beispiele
Grundlegende Verwendung
const besucht = new WeakSet();
const user = { name: 'Anna' };
besucht.add(user);
console.log(besucht.has(user)); // true
console.log(besucht.delete(user)); // true
console.log(besucht.has(user)); // false
console.log(besucht.delete(user)); // false – war nicht mehr enthalten
Referenz statt Inhalt vergleichen
const set = new WeakSet();
const a = { id: 1 };
set.add(a);
// Ein neues Objekt mit gleichem Inhalt ist nicht dasselbe Objekt
console.log(set.delete({ id: 1 })); // false
console.log(set.delete(a)); // true
// Primitive Werte: kein Fehler, nur false
console.log(set.delete('text')); // false
Laufende Verarbeitung pro Objekt sperren
const inArbeit = new WeakSet();
const speichern = async (dokument) => {
if (inArbeit.has(dokument)) {
console.log('Speichern läuft bereits');
return;
}
inArbeit.add(dokument);
try {
await new Promise((r) => setTimeout(r, 100)); // simulierter Server-Aufruf
console.log(`Gespeichert: ${dokument.titel}`);
} finally {
inArbeit.delete(dokument); // Sperre in jedem Fall wieder aufheben
}
};
const doc = { titel: 'Bericht' };
speichern(doc);
speichern(doc);
// Wichtig · Fallstricke
- Verglichen wird die Referenz: Ein Objekt mit gleichem Inhalt ist nicht dasselbe Objekt und wird deshalb nicht entfernt.
- Nicht-Objekte (Zahlen, Strings,
null, registrierte Symbole ausSymbol.for()) führen zufalse, nicht zu einem Fehler. - Um Speicher freizugeben, braucht man
delete()meist nicht: Objekte ohne weitere Referenzen werden ohnehin von der Speicherbereinigung entfernt.delete()ist für die Programmlogik gedacht, also um eine Markierung gezielt aufzuheben. - Ein
WeakSethat keineclear()-Methode und lässt sich nicht durchlaufen. Man kann daher nur Objekte löschen, auf die man noch eine Referenz hat. - Nicht registrierte Symbole als Werte werden erst ab ES2023 unterstützt, in älteren Umgebungen nicht.
WeakSetselbst funktioniert in allen modernen Browsern und in Node.js.