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

WeakMap.prototype.delete()

Methode

Entfernt den Eintrag zum angegebenen Schlüssel aus einer <code>WeakMap</code> und gibt zurück, ob ein Eintrag gelöscht wurde.

seit JavaScript ES2015 Kategorie: method-property

Signatur

WeakMap.prototype.delete(key)

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
true false false

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));
false false true

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));
20 25

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));
true false

// Wichtig · Fallstricke

  • Kein Fehler bei ungültigen Schlüsseln: Anders als set(), das bei Primitiven einen TypeError wirft, gibt delete() einfach false zurück. Tippfehler oder falsche Referenzen bleiben so leicht unbemerkt – den Rückgabewert prüfen, wenn das Löschen wichtig ist.
  • Kein clear(): WeakMap besitzt keine Methode zum Leeren (WeakMap.prototype.clear() wurde früh aus Browsern entfernt). Zum vollständigen Zurücksetzen einfach eine neue WeakMap anlegen.
  • Nicht aufzählbar: Da man über eine WeakMap nicht 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 liefert delete(symbol) immer false.
  • Kompatibilität: in allen modernen Browsern und Node.js seit Langem unterstützt (Baseline).