Signatur
Beschreibung
Mit new WeakSet() legst du eine Sammlung an, in der jedes Objekt höchstens einmal vorkommt. Anders als bei Set sind die Referenzen schwach: Gibt es sonst keine Referenz mehr auf ein gespeichertes Objekt, darf der Garbage Collector es freigeben, und es verschwindet automatisch aus dem WeakSet.
Optional nimmt der Konstruktor ein iterierbares Objekt entgegen, etwa ein Array. Jedes Element wird über add() eingefügt. Alle Elemente müssen Objekte oder nicht registrierte Symbole sein, sonst wird ein TypeError geworfen.
Typische Einsatzgebiete sind das Markieren von Objekten, ohne sie zu verändern oder Speicherlecks zu riskieren: bereits verarbeitete DOM-Knoten, besuchte Knoten beim Durchlaufen zyklischer Strukturen oder „Marken“ für Instanzen, die über einen eigenen Konstruktor erzeugt wurden (Brand-Check).
Ein WeakSet lässt sich nicht durchlaufen und hat keine size-Eigenschaft. Es gibt nur add(), has() und delete().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $iterable | Iterable<object | symbol> | null | undefined | undefined | Optionales iterierbares Objekt, dessen Elemente alle in das neue WeakSet übernommen werden. Bei null oder undefined ist das WeakSet anfangs leer. |
Rückgabewert
WeakSet-Objekt, das mit den Elementen aus iterable gefüllt ist (falls angegeben).Beispiele
Leeres und vorbefülltes WeakSet anlegen
const a = { id: 1 };
const b = { id: 2 };
const leer = new WeakSet();
const befuellt = new WeakSet([a, b]);
console.log(leer.has(a)); // false
console.log(befuellt.has(a)); // true
console.log(befuellt.has({ id: 1 })); // false – andere Referenz
Zyklische Strukturen sicher durchlaufen
const zaehleKnoten = (knoten, besucht = new WeakSet()) => {
if (besucht.has(knoten)) return 0;
besucht.add(knoten);
return 1 + (knoten.kinder ?? []).reduce((sum, k) => sum + zaehleKnoten(k, besucht), 0);
};
const wurzel = { kinder: [] };
const kind = { kinder: [wurzel] }; // Zyklus!
wurzel.kinder.push(kind);
console.log(zaehleKnoten(wurzel));
Brand-Check für Klasseninstanzen
const instanzen = new WeakSet();
class Konto {
constructor() {
instanzen.add(this);
}
static istEcht(obj) {
return instanzen.has(obj);
}
}
const k = new Konto();
const faelschung = Object.create(Konto.prototype);
console.log(Konto.istEcht(k)); // true
console.log(Konto.istEcht(faelschung)); // false
Fehler bei primitiven Werten
try {
new WeakSet([1, 'text']);
} catch (err) {
console.log(err instanceof TypeError);
}
// Wichtig · Fallstricke
WeakSetmuss mitnewaufgerufen werden.WeakSet()ohnenewwirft einenTypeError.- Nur Objekte und (seit ES2023) nicht registrierte Symbole sind erlaubt. Primitive Werte und über
Symbol.for()erzeugte Symbole führen zu einemTypeError. - Kein Durchlaufen, kein
size, keinclear(). Wenn du den Inhalt auflisten musst, nimmSet. - Wann der Garbage Collector aufräumt, ist nicht festgelegt. Verlass dich also nicht auf den Zeitpunkt, zu dem Einträge verschwinden.
- Kompatibilität: wird in allen modernen Browsern und in Node.js (ab 0.12) unterstützt. Symbole als Elemente funktionieren erst in neueren Engines (ES2023).