Signatur
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
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' }));
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);
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));
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
undefinedals Wert sehen gleich aus:get()liefert in beiden Fällenundefined. Wenn beides vorkommen kann, prüfen Sie vorher mithas(). - Kein Fehler bei primitiven Schlüsseln:
wm.get('abc')oderwm.get(42)geben einfachundefinedzurück. EinenTypeErrorwirft nurset(). - 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
Mapmit 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
WeakMapkann man nicht iterieren, und sie hat keinsize. Mitget()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).