Signatur
Beschreibung
Die Methode has() prüft, ob ein bestimmter Wert in einer Set-Instanz vorkommt. Sie gibt true zurück, wenn der Wert vorhanden ist, andernfalls false. Weil ein Set intern als Hash-Struktur umgesetzt ist, läuft die Suche im Mittel in konstanter Zeit (O(1)). Das ist deutlich schneller als Array.prototype.includes(), das jedes Element einzeln durchgeht (O(n)).
Für den Vergleich nutzt has() den Algorithmus SameValueZero. Er verhält sich wie ===, mit zwei Ausnahmen: NaN gilt als gleich zu NaN, und +0 und -0 werden als gleich behandelt. Objekte, Arrays und Funktionen werden über ihre Referenz verglichen, nicht über ihren Inhalt.
Typische Einsatzfälle sind schnelle Mitgliedschaftsprüfungen, zum Beispiel für Erlaubnislisten (Whitelists), bereits besuchte Knoten bei Graph-Durchläufen, das Entfernen von Duplikaten in Schleifen oder das Prüfen von Berechtigungen und Feature-Flags.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $value Pflicht | any | Der Wert, nach dem im Set gesucht wird. Verglichen wird mit SameValueZero, Objekte also über ihre Referenz. |
Rückgabewert
true, wenn der Wert im Set vorhanden ist, sonst false.Beispiele
Einfache Prüfung auf Mitgliedschaft
const farben = new Set(['rot', 'grün', 'blau']);
console.log(farben.has('grün'));
console.log(farben.has('gelb'));
console.log(farben.has('Rot')); // Groß-/Kleinschreibung zählt
Erlaubte Dateiendungen beim Upload prüfen
const erlaubteEndungen = new Set(['jpg', 'jpeg', 'png', 'webp']);
const istErlaubt = (dateiname) => {
const endung = dateiname.split('.').pop().toLowerCase();
return erlaubteEndungen.has(endung);
};
console.log(istErlaubt('urlaub.JPG'));
console.log(istErlaubt('script.exe'));
Besuchte Knoten beim Graph-Durchlauf merken
const graph = {
A: ['B', 'C'],
B: ['A', 'D'],
C: ['D'],
D: ['A']
};
const durchlaufe = (start) => {
const besucht = new Set();
const stapel = [start];
while (stapel.length > 0) {
const knoten = stapel.pop();
if (besucht.has(knoten)) continue; // Zyklen vermeiden
besucht.add(knoten);
stapel.push(...graph[knoten]);
}
return [...besucht];
};
console.log(durchlaufe('A'));
Sonderfälle: NaN, -0 und Objektreferenzen
const s = new Set([NaN, 0, { id: 1 }]);
console.log(s.has(NaN)); // SameValueZero: NaN ist gleich NaN
console.log(s.has(-0)); // -0 und +0 gelten als gleich
console.log(s.has({ id: 1 })); // anderes Objekt, andere Referenz
const nutzer = { id: 2 };
s.add(nutzer);
console.log(s.has(nutzer)); // gleiche Referenz
// Wichtig · Fallstricke
- Objekte werden über ihre Referenz verglichen:
set.has({ a: 1 })ergibt immerfalse, auch wenn ein Objekt mit gleichem Inhalt im Set liegt. Wer inhaltlich vergleichen will, speichert besser eindeutige Schlüssel wie IDs oder JSON-Strings, oder nimmt eineMapmit ID als Schlüssel. - Keine Typumwandlung:
new Set([1]).has('1')ergibtfalse, weil Zahl und String verschiedene Werte sind. - Leistung: Bei häufigen Prüfungen auf großen Datenmengen lohnt es sich, ein Array einmal in ein
Setumzuwandeln (new Set(array)) und danachhas()zu nutzen, statt immer wiederincludes()aufzurufen. - Wird
has()auf einem Objekt aufgerufen, das keinSetist (z. B. überSet.prototype.has.call({}, 1)), wird einTypeErrorausgelöst. - Kompatibilität: Wird von allen modernen Browsern und von Node.js seit ES2015 unterstützt (Baseline). Der Internet Explorer 11 unterstützt
has()zwar, aber nicht die Initialisierung über ein Iterable im Konstruktor.