Signatur
Beschreibung
Die Methode delete() entfernt den Eintrag, dessen Schlüssel mit key übereinstimmt, aus der WeakMap. Der Vergleich erfolgt über die Objektidentität: Nur genau dieselbe Referenz trifft den Eintrag, ein strukturell gleiches Objekt nicht.
Normalerweise braucht man delete() bei einer WeakMap seltener als bei einer Map, weil Einträge automatisch vom Garbage Collector entfernt werden, sobald der Schlüssel nirgends sonst mehr referenziert wird. Sinnvoll ist das explizite Löschen trotzdem, wenn zugeordnete Daten sofort ungültig werden sollen, obwohl das Schlüsselobjekt weiterlebt – etwa beim Leeren eines Caches, beim Abmelden eines DOM-Elements aus einer Komponente oder beim Zurücksetzen privater Zustände.
Der Rückgabewert zeigt an, ob tatsächlich etwas gelöscht wurde: true, wenn ein Eintrag existierte, sonst false. Ungültige Schlüssel (Primitive, registrierte Symbole) werfen keinen Fehler, sondern liefern einfach false.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $key Pflicht | object | symbol | Schlüssel des zu entfernenden Eintrags. Muss dieselbe Objekt- bzw. (nicht registrierte) Symbol-Referenz sein, die bei set() verwendet wurde. |
Beispiele
Grundlegende Verwendung
const wm = new WeakMap();
const user = { name: 'Anna' };
wm.set(user, { lastLogin: Date.now() });
console.log(wm.delete(user)); // Eintrag vorhanden
console.log(wm.has(user));
console.log(wm.delete(user)); // bereits gelöscht
Objektidentität statt Strukturgleichheit
const wm = new WeakMap();
const key = { id: 1 };
wm.set(key, 'Daten');
// Anderes Objekt mit gleichem Inhalt trifft den Eintrag nicht
console.log(wm.delete({ id: 1 }));
// Primitive sind keine gültigen Schlüssel – kein Fehler, nur false
console.log(wm.delete('id'));
console.log(wm.delete(key));
Cache für berechnete Werte gezielt invalidieren
const cache = new WeakMap();
const getTotal = (cart) => {
if (!cache.has(cart)) {
const total = cart.items.reduce((sum, i) => sum + i.price * i.qty, 0);
cache.set(cart, total);
}
return cache.get(cart);
};
const addItem = (cart, item) => {
cart.items.push(item);
cache.delete(cart); // Warenkorb geändert → gecachten Wert verwerfen
};
const cart = { items: [{ price: 10, qty: 2 }] };
console.log(getTotal(cart));
addItem(cart, { price: 5, qty: 1 });
console.log(getTotal(cart));
Zustand eines DOM-Elements beim Abmelden entfernen
const state = new WeakMap();
const mount = (el) => {
const onClick = () => console.log('Klick auf', el.id);
el.addEventListener('click', onClick);
state.set(el, { onClick });
};
const unmount = (el) => {
const entry = state.get(el);
if (!entry) return false;
el.removeEventListener('click', entry.onClick);
return state.delete(el);
};
const button = document.createElement('button');
button.id = 'speichern';
mount(button);
console.log(unmount(button));
console.log(unmount(button));
// Wichtig · Fallstricke
- Kein Fehler bei ungültigen Schlüsseln: Anders als
set(), das bei Primitiven einenTypeErrorwirft, gibtdelete()einfachfalsezurück. Tippfehler oder falsche Referenzen bleiben so leicht unbemerkt – den Rückgabewert prüfen, wenn das Löschen wichtig ist. - Kein
clear():WeakMapbesitzt keine Methode zum Leeren (WeakMap.prototype.clear()wurde früh aus Browsern entfernt). Zum vollständigen Zurücksetzen einfach eine neueWeakMapanlegen. - Nicht aufzählbar: Da man über eine
WeakMapnicht iterieren kann, lassen sich nur Einträge löschen, deren Schlüssel man noch referenziert. - Automatische Bereinigung: Oft ist
delete()gar nicht nötig – fällt der Schlüssel weg, gibt der Garbage Collector den Eintrag ohnehin frei. Explizit löschen lohnt sich, wenn der Schlüssel weiterlebt, die Daten aber ungültig sind. - Symbole als Schlüssel (nicht registrierte, also nicht per
Symbol.for()erzeugt) sind erst ab ES2023 erlaubt; in älteren Umgebungen liefertdelete(symbol)immerfalse. - Kompatibilität: in allen modernen Browsern und Node.js seit Langem unterstützt (Baseline).