Signatur
Beschreibung
Der Konstruktor new WeakMap() erzeugt eine leere WeakMap oder füllt sie direkt aus einem iterierbaren Objekt mit Schlüssel-Wert-Paaren. Die Schlüssel müssen Objekte sein (seit ES2023 auch nicht registrierte Symbole). Primitive Werte wie Strings oder Zahlen sind als Schlüssel nicht erlaubt.
Das Besondere: Die WeakMap hält ihre Schlüssel nur schwach. Gibt es außerhalb der Map keine Referenz mehr auf ein Schlüsselobjekt, kann der Garbage Collector Schlüssel und zugehörigen Wert freigeben. Damit eignet sich WeakMap ideal, um Zusatzdaten an Objekte zu hängen, ohne Speicherlecks zu erzeugen – etwa Metadaten zu DOM-Knoten, Caches für berechnete Ergebnisse oder private Daten von Klasseninstanzen.
Weil Einträge jederzeit verschwinden können, ist eine WeakMap nicht iterierbar: Es gibt kein size, kein keys(), kein forEach(). Verfügbar sind nur get(), set(), has() und delete().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $iterable | Iterable<[object, any]> | null | undefined | undefined | Optional. Ein iterierbares Objekt (z. B. ein Array), dessen Elemente zweielementige Arrays [schlüssel, wert] sind. Jedes Paar wird per set() eingefügt. Bei null oder undefined entsteht eine leere WeakMap. |
Rückgabewert
WeakMap-Objekt, gegebenenfalls mit den Einträgen aus iterable vorbefüllt.Beispiele
Leere WeakMap erzeugen und befüllen
const metadaten = new WeakMap();
const benutzer = { name: 'Anna' };
metadaten.set(benutzer, { letzterLogin: '2024-05-01' });
console.log(metadaten.get(benutzer));
console.log(metadaten.has({ name: 'Anna' })); // anderes Objekt!
Mit Anfangswerten aus einem Array initialisieren
const a = {};
const b = function () {};
const wm = new WeakMap([
[a, 'Objekt-Schlüssel'],
[b, 'Funktion als Schlüssel']
]);
console.log(wm.get(a));
console.log(wm.get(b));
Private Daten einer Klasse speichern
const privat = new WeakMap();
class Konto {
constructor(stand) {
privat.set(this, { stand });
}
einzahlen(betrag) {
privat.get(this).stand += betrag;
}
get stand() {
return privat.get(this).stand;
}
}
const konto = new Konto(100);
konto.einzahlen(50);
console.log(konto.stand);
// Wird 'konto' nicht mehr referenziert, verschwinden auch die privaten Daten
Ergebnis-Cache für Objekte
const cache = new WeakMap();
const summe = (zahlen) => {
if (cache.has(zahlen)) return cache.get(zahlen);
const ergebnis = zahlen.reduce((s, n) => s + n, 0);
cache.set(zahlen, ergebnis);
return ergebnis;
};
const daten = [1, 2, 3, 4];
console.log(summe(daten)); // berechnet
console.log(summe(daten)); // aus dem Cache
// Wichtig · Fallstricke
- Nur mit
newaufrufbar:WeakMap()ohnenewwirft einenTypeError. - Ungültige Schlüssel: Primitive Werte (
'id',42) oder mitSymbol.for()registrierte Symbole als Schlüssel führen zu einemTypeError– auch schon beim Befüllen überiterable. - Nicht iterierbar: Kein
size, keine Schleifen, keinclear()(wurde entfernt). Wer den Inhalt auflisten muss, braucht eineMap. - Werte werden stark gehalten: Referenziert der Wert seinen eigenen Schlüssel, ist das unkritisch (Ephemeron-Semantik), der Wert bleibt aber so lange erhalten wie der Schlüssel.
- Zeitpunkt der Freigabe ist nicht vorhersagbar – verlasse dich nicht auf die Garbage Collection für Programmlogik.
- Kompatibilität: Unterstützt in allen modernen Browsern und Node.js; Symbole als Schlüssel erst ab ES2023 (Chrome 108, Firefox 145-, Safari 16.4 teils abweichend – vor Einsatz prüfen).