Start · Sprachen · JavaScript · Referenz · new WeakSet()

new WeakSet()

Methode

Der <code>WeakSet()</code>-Konstruktor erzeugt ein neues <code>WeakSet</code>, das Objekte (und nicht registrierte Symbole) schwach referenziert speichert.

seit JavaScript ES2015 Kategorie: method-property

Signatur

new WeakSet(iterable)

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

Typ
WeakSet
Beschreibung
Ein neues 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
false true false

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));
2

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
true false

Fehler bei primitiven Werten

try {
  new WeakSet([1, 'text']);
} catch (err) {
  console.log(err instanceof TypeError);
}
true

// Wichtig · Fallstricke

  • WeakSet muss mit new aufgerufen werden. WeakSet() ohne new wirft einen TypeError.
  • Nur Objekte und (seit ES2023) nicht registrierte Symbole sind erlaubt. Primitive Werte und über Symbol.for() erzeugte Symbole führen zu einem TypeError.
  • Kein Durchlaufen, kein size, kein clear(). Wenn du den Inhalt auflisten musst, nimm Set.
  • 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).