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

Set.prototype.isDisjointFrom()

Methode

Prüft, ob dieses <code>Set</code> und eine andere mengenähnliche Struktur keine gemeinsamen Elemente haben, und gibt <code>true</code> oder <code>false</code> zurück.

seit JavaScript ES2025 – Baseline 2024 (Chrome 122, Firefox 127, S Kategorie: method-property

Signatur

Set.prototype.isDisjointFrom(other)

Beschreibung

isDisjointFrom() gehört zu den neuen Mengenmethoden von Set. Sie gibt true zurück, wenn die beiden Mengen disjunkt sind, also kein einziges Element gemeinsam haben. Mathematisch entspricht das der Aussage A ∩ B = ∅. Dafür muss keine Schnittmenge erzeugt werden, und die Prüfung bricht ab, sobald das erste gemeinsame Element gefunden ist.

Die Methode eignet sich für Konfliktprüfungen, zum Beispiel ob sich zwei Rollen-, Tag- oder Terminlisten überschneiden, ob ein Benutzer gesperrte Berechtigungen hat oder ob zwei Auswahlen sich gegenseitig ausschließen. Verglichen wird wie bei Set üblich nach dem Algorithmus SameValueZero: NaN gilt als gleich NaN, +0 als gleich -0, und Objekte werden nach ihrer Referenz verglichen, nicht nach ihrem Inhalt.

Das Argument muss kein echtes Set sein, aber mengenähnlich: Es braucht eine numerische Eigenschaft size sowie die Methoden has() und keys(). Eine Map erfüllt diese Anforderung, dann werden ihre Schlüssel verglichen. Ein Array erfüllt sie nicht. Je nachdem, welche Menge kleiner ist, durchläuft die Engine entweder das eigene Set und ruft other.has() auf, oder sie durchläuft other.keys() und prüft gegen das eigene Set.

Parameter

Name Typ Default Beschreibung
$other Pflicht Set | Map | SetLike (Objekt mit size, has(), keys()) Die Menge, mit der verglichen wird. Sie muss mengenähnlich sein: eine Zahl in size sowie aufrufbare Methoden has() und keys(). Andernfalls wird ein TypeError geworfen.

Beispiele

Grundlagen: gerade und ungerade Zahlen

const gerade = new Set([2, 4, 6, 8]);
const ungerade = new Set([1, 3, 5, 7]);
const primzahlen = new Set([2, 3, 5, 7]);

console.log(gerade.isDisjointFrom(ungerade));    // keine Überschneidung
console.log(gerade.isDisjointFrom(primzahlen));  // 2 ist gemeinsam
console.log(new Set().isDisjointFrom(gerade));   // leere Menge
true false true

Berechtigungsprüfung: gesperrte Rechte erkennen

const gesperrteRechte = new Set(['admin:delete', 'billing:write']);

const darfZugreifen = (benutzerRechte) =>
  new Set(benutzerRechte).isDisjointFrom(gesperrteRechte);

console.log(darfZugreifen(['posts:read', 'posts:write']));
console.log(darfZugreifen(['posts:read', 'billing:write']));
true false

Terminkonflikt: belegte Zeitslots vergleichen

const belegtAnna = new Set(['09:00', '10:00', '14:00']);
const belegtBen = new Map([
  ['11:00', 'Kundentermin'],
  ['15:00', 'Review']
]);

// Eine Map ist mengenähnlich – verglichen werden ihre Schlüssel
if (belegtAnna.isDisjointFrom(belegtBen)) {
  console.log('Keine Überschneidung – gemeinsames Meeting planbar.');
} else {
  console.log('Konflikt gefunden!');
}
Keine Überschneidung – gemeinsames Meeting planbar.

Arrays vorher in ein Set umwandeln

const tags = new Set(['js', 'css']);
const verbotene = ['php', 'perl'];

try {
  tags.isDisjointFrom(verbotene); // Array ist nicht mengenähnlich
} catch (err) {
  console.log(err.constructor.name);
}

console.log(tags.isDisjointFrom(new Set(verbotene)));
TypeError true

// Wichtig · Fallstricke

  • Arrays werden nicht akzeptiert: Ein Array hat kein size und kein has(), deshalb wird ein TypeError geworfen. Wandle es vorher mit new Set(array) um.
  • Objekte werden nach Referenz verglichen: new Set([{id: 1}]).isDisjointFrom(new Set([{id: 1}])) ergibt true, weil es zwei verschiedene Objekte sind.
  • Kompatibilität: Seit 2024 in allen aktuellen Browsern verfügbar (Chrome/Edge 122, Firefox 127, Safari 17) sowie in Node.js ab Version 22. Standardisiert wurde die Methode mit ES2025. Für ältere Umgebungen gibt es Polyfills, etwa in core-js. Alternativ geht auch ![...a].some(x => b.has(x)).
  • Eigene mengenähnliche Objekte: Hier ist size maßgeblich dafür, welche Seite durchlaufen wird. Stimmt size nicht mit den tatsächlichen Elementen überein, kann das Ergebnis falsch sein. Ist size NaN oder keine Zahl, wird ein TypeError geworfen.
  • Die Methode verändert keine der beiden Mengen.