Signatur
Beschreibung
Die Methode has() von Map-Instanzen gibt einen booleschen Wert zurück. Er zeigt an, ob in der Map ein Eintrag mit dem angegebenen Schlüssel existiert. Der Wert des Eintrags spielt dabei keine Rolle: Auch ein Eintrag mit dem Wert undefined gilt als vorhanden.
Genau das ist der wichtigste Unterschied zu einer Prüfung mit map.get(key) !== undefined. Nur has() kann zuverlässig unterscheiden, ob ein Schlüssel fehlt oder ob unter ihm undefined gespeichert ist. Typische Einsatzfälle sind Caches, das Entfernen von Duplikaten, Zähler und das Prüfen, ob etwas schon registriert ist.
Schlüssel werden nach dem Algorithmus SameValueZero verglichen. Deshalb gilt NaN als gleich zu NaN, und +0 und -0 werden gleich behandelt. Objekte, Arrays und Funktionen werden über ihre Referenz verglichen, nicht über ihren Inhalt. Die Suche läuft bei gängigen Implementierungen im Mittel in konstanter Zeit (sublinear, wie von der Spezifikation verlangt).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $key Pflicht | any | Der Schlüssel, nach dem in der Map gesucht wird. Das kann jeder Wert sein, auch Objekte, Funktionen oder NaN. |
Rückgabewert
true, wenn ein Eintrag mit dem Schlüssel existiert, sonst false.Beispiele
Einfache Prüfung auf vorhandene Schlüssel
const rollen = new Map([
['anna', 'admin'],
['ben', 'editor']
]);
console.log(rollen.has('anna'));
console.log(rollen.has('clara'));
has() statt get() bei undefined-Werten
const einstellungen = new Map();
einstellungen.set('theme', undefined);
// get() kann fehlende und undefined-Einträge nicht unterscheiden
console.log(einstellungen.get('theme') !== undefined);
console.log(einstellungen.has('theme'));
console.log(einstellungen.has('sprache'));
Einfacher Cache für asynchrone Anfragen
const cache = new Map();
const ladeBenutzer = async (id) => {
if (cache.has(id)) {
return cache.get(id);
}
const res = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`);
const daten = await res.json();
cache.set(id, daten);
return daten;
};
const main = async () => {
await ladeBenutzer(1); // Netzwerkanfrage
console.log(cache.has(1)); // jetzt im Cache
};
main();
Objektschlüssel werden per Referenz verglichen
const knoten = { id: 1 };
const besucht = new Map([[knoten, true]]);
console.log(besucht.has(knoten)); // gleiche Referenz
console.log(besucht.has({ id: 1 })); // neues Objekt, andere Referenz
const zahlen = new Map([[NaN, 'keine Zahl']]);
console.log(zahlen.has(NaN)); // SameValueZero
// Wichtig · Fallstricke
- Referenzvergleich:
map.has({ a: 1 })ist fast immerfalse, weil jedes Objektliteral eine neue Referenz erzeugt. Wer nach Inhalt suchen will, braucht einen einfachen Schlüssel, etwa eine ID oder einen serialisierten String. - Keine Typumwandlung: Anders als bei normalen Objekten sind
1und'1'in einerMapzwei verschiedene Schlüssel. has()+get(): Das Muster durchsucht die Map zweimal. Wenn niemalsundefinedals Wert gespeichert wird, reicht oft ein einzelnesget()mit Prüfung aufundefined.- Falscher
this-Wert: Wird die Methode auf etwas aufgerufen, das keineMapist (z. B.Map.prototype.has.call({}, 'x')), wirft sie einenTypeError. - Die Methode wird in allen modernen Browsern und seit Node.js 0.12 unterstützt (Baseline).