Start · Sprachen · JavaScript · Referenz · WeakMap.prototype.get()

WeakMap.prototype.get()

Methode

Gibt den Wert zurück, der in der <code>WeakMap</code> unter dem angegebenen Schlüssel gespeichert ist, oder <code>undefined</code>, wenn es keinen Eintrag gibt.

seit JavaScript ES2015 Kategorie: method-property

Signatur

WeakMap.prototype.get(key)

Beschreibung

Die Methode get() liest den Wert aus einer WeakMap, der zu einem bestimmten Schlüssel gehört. Schlüssel einer WeakMap sind immer Objekte oder (seit ES2023) nicht registrierte Symbole. Deshalb wird der Schlüssel über seine Identität gefunden (Referenzgleichheit) und nicht über seinen Inhalt.

Typische Einsatzfälle sind private Daten pro Objekt, Caches (Memoisierung) für Objekte und Metadaten zu DOM-Knoten. Die WeakMap hält ihre Schlüssel nur schwach: Wird ein Schlüsselobjekt sonst nirgends mehr referenziert, kann der Garbage Collector den Eintrag entfernen. Danach liefert get() natürlich nichts mehr, denn es gibt ja auch keine Referenz mehr, mit der man nachfragen könnte.

Ist kein Eintrag vorhanden, gibt get() undefined zurück. Wenn der Wert eines Eintrags selbst undefined sein kann, erkennt man nur mit has() sicher, ob der Schlüssel existiert.

Parameter

Name Typ Default Beschreibung
$key Pflicht object | symbol Der Schlüssel, dessen Wert gelesen werden soll. Muss dieselbe Objekt- bzw. Symbol-Referenz sein, die beim set() verwendet wurde. Bei primitiven Werten wird immer undefined zurückgegeben, es gibt keinen Fehler.

Rückgabewert

Typ
any
Beschreibung
Der Wert, der unter key gespeichert ist, oder undefined, wenn kein Eintrag existiert oder key kein gültiger Schlüssel ist.

Beispiele

Grundlegendes Lesen von Werten

const wm = new WeakMap();
const user = { name: 'Anna' };
const guest = { name: 'Gast' };

wm.set(user, { loginCount: 3 });

console.log(wm.get(user));
console.log(wm.get(guest));
// Ein inhaltsgleiches, aber anderes Objekt findet nichts
console.log(wm.get({ name: 'Anna' }));
{ loginCount: 3 } undefined undefined

Private Daten pro Instanz

const privates = new WeakMap();

class Konto {
  constructor(startSaldo) {
    privates.set(this, { saldo: startSaldo });
  }
  einzahlen(betrag) {
    privates.get(this).saldo += betrag;
  }
  get saldo() {
    return privates.get(this).saldo;
  }
}

const konto = new Konto(100);
konto.einzahlen(50);
console.log(konto.saldo);
150

Memoisierung teurer Berechnungen für Objekte

const cache = new WeakMap();

const summeBerechnen = (zahlen) => {
  const treffer = cache.get(zahlen);
  if (treffer !== undefined) {
    console.log('aus dem Cache');
    return treffer;
  }
  const ergebnis = zahlen.reduce((a, b) => a + b, 0);
  cache.set(zahlen, ergebnis);
  return ergebnis;
};

const daten = [1, 2, 3, 4];
console.log(summeBerechnen(daten));
console.log(summeBerechnen(daten));
10 aus dem Cache 10

Metadaten zu DOM-Elementen

const klickZaehler = new WeakMap();

document.querySelectorAll('button').forEach((btn) => {
  btn.addEventListener('click', () => {
    const anzahl = (klickZaehler.get(btn) ?? 0) + 1;
    klickZaehler.set(btn, anzahl);
    console.log(`${btn.textContent}: ${anzahl} Klick(s)`);
  });
});
// Wird ein Button aus dem DOM entfernt, kann sein Eintrag automatisch freigegeben werden.

// Wichtig · Fallstricke

  • Ein fehlender Eintrag und undefined als Wert sehen gleich aus: get() liefert in beiden Fällen undefined. Wenn beides vorkommen kann, prüfen Sie vorher mit has().
  • Kein Fehler bei primitiven Schlüsseln: wm.get('abc') oder wm.get(42) geben einfach undefined zurück. Einen TypeError wirft nur set().
  • Die Identität zählt, nicht der Inhalt: Ein Objekt mit gleichem Inhalt ist ein anderer Schlüssel. Für Nachschlagen über den Inhalt eignen sich Map mit Zeichenketten als Schlüssel.
  • Symbole als Schlüssel (ES2023) sind nur erlaubt, wenn sie nicht registriert sind. Mit Symbol.for() erzeugte Symbole sind ausgeschlossen. Ältere Umgebungen unterstützen Symbol-Schlüssel gar nicht.
  • Über eine WeakMap kann man nicht iterieren, und sie hat kein size. Mit get() kommen Sie also nur an Werte, wenn Sie die Schlüsselreferenz haben.
  • get() ist Baseline und läuft in allen modernen Browsern und in Node.js (ab 0.12).