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

Set.prototype.has()

Methode

Die Methode <code>has()</code> gibt einen booleschen Wert zurück, der angibt, ob ein bestimmter Wert im <code>Set</code> enthalten ist.

seit JavaScript ES2015 Kategorie: method-property

Signatur

Set.prototype.has(value)

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

Typ
boolean
Beschreibung
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
true false false

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

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'));
[ 'A', 'C', 'D', 'B' ]

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

// Wichtig · Fallstricke

  • Objekte werden über ihre Referenz verglichen: set.has({ a: 1 }) ergibt immer false, 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 eine Map mit ID als Schlüssel.
  • Keine Typumwandlung: new Set([1]).has('1') ergibt false, 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 Set umzuwandeln (new Set(array)) und danach has() zu nutzen, statt immer wieder includes() aufzurufen.
  • Wird has() auf einem Objekt aufgerufen, das kein Set ist (z. B. über Set.prototype.has.call({}, 1)), wird ein TypeError ausgelö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.