Start · Sprachen · JavaScript · Referenz · Set.prototype[Symbol.iterator]()

Set.prototype[Symbol.iterator]()

Methode

Gibt einen Iterator über die Werte eines <code>Set</code> in Einfügereihenfolge zurück und macht Sets damit für <code>for...of</code>, Spread-Syntax und Destrukturierung nutzbar.

seit JavaScript ES2015 Kategorie: method-property

Signatur

Set.prototype[Symbol.iterator]()

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

Typ
SetIterator
Beschreibung
Ein neues Set-Iterator-Objekt, das die Werte des Sets in Einfügereihenfolge liefert. Der Iterator ist selbst iterierbar (sein [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);
js css html [ 'js', 'css', 'html' ]

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);
{ value: 'auftrag-1', done: false } { value: 'auftrag-2', done: false } { value: undefined, done: true } auftrag-1

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));
true true [ 30, 10, 20 ]

Ä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);
}
1 2 4

// 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 Durchlauf set[Symbol.iterator]() erneut aufrufen.
  • Überschreiben: Wird Set.prototype[Symbol.iterator] verändert, ändert sich das Verhalten von for...of und Spread für alle Sets – nicht aber values(). Der Set-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 einen TypeError.
  • 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.