Signatur
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
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));
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({}));
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));
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)oderwm.has('abc')gibt einfachfalsezurück.set()mit solchen Schlüsseln wirft dagegen einenTypeError. - 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 immerfalse. - Doppelte Abfrage vermeiden: Wenn nie
undefinedals Wert gespeichert wird, reicht oft ein einziger Aufruf vonget()mit anschließender Prüfung aufundefined. So entfällt der zweite Zugriff überhas(). - Da eine
WeakMapnicht durchlaufen werden kann, isthas()nebenget()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.