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

new WeakMap()

Methode

Der <code>WeakMap()</code>-Konstruktor erzeugt eine neue <code>WeakMap</code>, also eine Schlüssel-Wert-Sammlung mit schwach gehaltenen Objekt-Schlüsseln.

seit JavaScript ES2015 Kategorie: method-property

Signatur

new WeakMap(iterable)

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

Typ
WeakMap
Beschreibung
Ein neues 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!
{ letzterLogin: '2024-05-01' } false

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));
Objekt-Schlüssel Funktion als Schlüssel

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
150

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
10 10

// Wichtig · Fallstricke

  • Nur mit new aufrufbar: WeakMap() ohne new wirft einen TypeError.
  • Ungültige Schlüssel: Primitive Werte ('id', 42) oder mit Symbol.for() registrierte Symbole als Schlüssel führen zu einem TypeError – auch schon beim Befüllen über iterable.
  • Nicht iterierbar: Kein size, keine Schleifen, kein clear() (wurde entfernt). Wer den Inhalt auflisten muss, braucht eine Map.
  • 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).