Signatur
Beschreibung
Die Methode [Symbol.iterator]() von Set-Instanzen implementiert das iterable-Protokoll. Sie wird automatisch aufgerufen, wenn ein Set an einer Stelle verwendet wird, die ein Iterable erwartet – etwa in for...of-Schleifen, bei der Spread-Syntax [...set], bei Array.from(set), bei Array-Destrukturierung oder bei Promise.all(set).
Der Anfangswert dieser Eigenschaft ist dasselbe Funktionsobjekt wie Set.prototype.values (und damit auch wie Set.prototype.keys). Es gilt also Set.prototype[Symbol.iterator] === Set.prototype.values. Der zurückgegebene Set-Iterator liefert jeden Wert genau einmal, in der Reihenfolge, in der er eingefügt wurde.
Direkt aufrufen muss man die Methode selten. Nützlich ist das vor allem, wenn man den Iterator manuell mit next() steuern möchte – beispielsweise, um nur das erste Element zu lesen oder um Werte schrittweise (lazy) zu verarbeiten. Seit ES2025 stehen auf dem Iterator zudem Iterator-Helfer wie map(), filter() und take() zur Verfügung.
Rückgabewert
[Symbol.iterator]() gibt ihn selbst zurück).Beispiele
Implizite Nutzung mit for...of und Spread
const tags = new Set(['js', 'css', 'html', 'js']);
// for...of ruft intern tags[Symbol.iterator]() auf
for (const tag of tags) {
console.log(tag);
}
// Spread-Syntax: schnelles Entfernen von Duplikaten
const unique = [...tags];
console.log(unique);
Iterator manuell mit next() steuern
const queue = new Set(['auftrag-1', 'auftrag-2']);
const it = queue[Symbol.iterator]();
console.log(it.next()); // erstes Element
console.log(it.next());
console.log(it.next()); // erschöpft
// Nur das erste Element eines Sets lesen
const [first] = queue;
console.log(first);
Identität mit values() prüfen
console.log(Set.prototype[Symbol.iterator] === Set.prototype.values);
console.log(Set.prototype.keys === Set.prototype.values);
const ids = new Set([3, 1, 2]);
console.log(Array.from(ids[Symbol.iterator](), (id) => id * 10));
Änderungen während der Iteration
const set = new Set([1, 2, 3]);
for (const n of set) {
if (n === 1) set.add(4); // wird noch besucht
if (n === 2) set.delete(3); // wird nicht mehr besucht
console.log(n);
}
// Wichtig · Fallstricke
- Live-Iterator: Der Iterator arbeitet auf dem aktuellen Zustand des Sets. Während der Iteration hinzugefügte Werte werden noch besucht, gelöschte, noch nicht besuchte Werte nicht mehr. Wer das vermeiden will, iteriert über eine Kopie (
[...set]). - Einmalig verwendbar: Ein erschöpfter Iterator liefert dauerhaft
{ value: undefined, done: true }. Für einen neuen Durchlaufset[Symbol.iterator]()erneut aufrufen. - Überschreiben: Wird
Set.prototype[Symbol.iterator]verändert, ändert sich das Verhalten vonfor...ofund Spread für alle Sets – nicht abervalues(). DerSet-Konstruktor selbst nutzt zum Befüllen den Iterator des übergebenen Arguments, nicht diesen. - Falscher
this-Wert: Ein Aufruf auf einem Nicht-Set (z. B.Set.prototype[Symbol.iterator].call({})) wirft einenTypeError. - Kompatibilität: Unterstützt in allen modernen Browsern und Node.js seit ES2015 (Baseline). Iterator-Helfer (
.map(),.filter()auf dem Iterator) sind neuer (ES2025) und in älteren Umgebungen nicht verfügbar.