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

WeakMap.prototype.has()

Methode

Prüft, ob eine <code>WeakMap</code> einen Eintrag zum angegebenen Schlüssel enthält, und gibt <code>true</code> oder <code>false</code> zurück.

seit JavaScript ES2015 Kategorie: method-property

Signatur

WeakMap.prototype.has(key)

Beschreibung

Die Methode has() prüft, ob es in einer WeakMap einen Eintrag für den übergebenen Schlüssel gibt. Das Ergebnis ist immer ein boolescher Wert: true, wenn ein Eintrag existiert, sonst false.

Sinnvoll ist has() vor allem dann, wenn Sie unterscheiden müssen, ob ein Schlüssel fehlt oder ob er mit dem Wert undefined gespeichert wurde. In beiden Fällen gibt get() nämlich undefined zurück. Typische Einsatzfälle sind Caches pro Objekt (Memoisierung), das Markieren bereits verarbeiteter DOM-Knoten oder private Daten zu Klasseninstanzen.

Schlüssel werden über ihre Identität verglichen, nicht über ihren Inhalt. Zwei Objekte mit gleichem Inhalt gelten also als verschiedene Schlüssel. Weil eine WeakMap ihre Schlüssel nur schwach referenziert, kann ein Eintrag nach der Speicherbereinigung (Garbage Collection) verschwinden. Das lässt sich aber nicht beobachten, denn um has() aufzurufen, brauchen Sie selbst eine Referenz auf den Schlüssel, und damit bleibt er erhalten.

Parameter

Name Typ Default Beschreibung
$key Pflicht object | symbol Der Schlüssel, dessen Vorhandensein geprüft wird. Gültig sind Objekte und (seit ES2023) nicht registrierte Symbole. Bei anderen Werten gibt die Methode einfach false zurück und wirft keinen Fehler.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn in der WeakMap ein Eintrag mit dem Schlüssel key existiert, sonst false.

Beispiele

Grundlegende Prüfung auf vorhandene Schlüssel

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

wm.set(user, 'Admin');

console.log(wm.has(user));  // Eintrag vorhanden
console.log(wm.has(guest)); // anderes Objekt, gleicher Inhalt

wm.delete(user);
console.log(wm.has(user));
true false false

undefined als Wert von einem fehlenden Schlüssel unterscheiden

const settings = new WeakMap();
const widget = {};

settings.set(widget, undefined);

console.log(settings.get(widget)); // undefined – aber warum?
console.log(settings.has(widget)); // Eintrag existiert tatsächlich
console.log(settings.has({}));
undefined true false

Memoisierung pro Objekt

const cache = new WeakMap();

const computeStats = (data) => {
  if (cache.has(data)) {
    console.log('aus dem Cache');
    return cache.get(data);
  }
  const sum = data.values.reduce((a, b) => a + b, 0);
  const result = { sum, avg: sum / data.values.length };
  cache.set(data, result);
  return result;
};

const dataset = { values: [4, 8, 12] };
console.log(computeStats(dataset));
console.log(computeStats(dataset));
{ sum: 24, avg: 8 } aus dem Cache { sum: 24, avg: 8 }

DOM-Elemente nur einmal initialisieren

const initialized = new WeakMap();

const enhance = (el) => {
  if (initialized.has(el)) return; // schon eingerichtet
  el.addEventListener('click', () => el.classList.toggle('active'));
  initialized.set(el, { since: Date.now() });
};

document.querySelectorAll('.toggle').forEach(enhance);
// Ein zweiter Durchlauf registriert keine doppelten Listener
document.querySelectorAll('.toggle').forEach(enhance);

// Wichtig · Fallstricke

  • Keine Ausnahme bei ungültigen Schlüsseln: wm.has(42) oder wm.has('abc') gibt einfach false zurück. set() mit solchen Schlüsseln wirft dagegen einen TypeError.
  • Vergleich über Identität: Es zählt die Referenz, nicht der Inhalt. Ein nachgebautes Objekt mit gleichen Eigenschaften wird nicht gefunden.
  • Symbole als Schlüssel sind erst seit ES2023 erlaubt und nur, wenn sie nicht registriert sind. Mit Symbol.for() erzeugte Symbole ergeben immer false.
  • Doppelte Abfrage vermeiden: Wenn nie undefined als Wert gespeichert wird, reicht oft ein einziger Aufruf von get() mit anschließender Prüfung auf undefined. So entfällt der zweite Zugriff über has().
  • Da eine WeakMap nicht durchlaufen werden kann, ist has() neben get() der einzige Weg, etwas über ihren Inhalt zu erfahren.
  • Kompatibilität: Die Methode wird von allen modernen Browsern und von Node.js unterstützt (Baseline). Den Aufruf mit einem nicht registrierten Symbol als Schlüssel beherrschen nur neuere Engines.