Signatur
Beschreibung
Iterator.prototype.join() durchläuft einen Iterator bis zum Ende, wandelt jeden erzeugten Wert in einen String um und verbindet alle zu einem einzigen String. Zwischen den Werten steht der angegebene separator, ohne Angabe ein Komma (","). Die Methode verhält sich also wie Array.prototype.join(), du musst den Iterator aber nicht erst mit Array.from() oder dem Spread-Operator in ein Array umwandeln.
Besonders praktisch ist das am Ende einer Kette von Iterator-Helfern wie map(), filter() oder take(). Die Werte werden verzögert (lazy) verarbeitet und erst beim join() tatsächlich erzeugt. Dadurch entsteht kein Zwischen-Array, was bei Generatoren oder großen Datenmengen Speicher spart.
Beachte: join() ist eine verbrauchende Methode. Der Iterator läuft dabei bis zum Ende durch und liefert danach keine Werte mehr. Einen unendlichen Iterator musst du vorher mit take() begrenzen, sonst endet der Aufruf nie.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $separator | string | "," | String, der zwischen zwei Werte gesetzt wird. Ohne Angabe (oder bei undefined) wird ein Komma verwendet. Ein leerer String "" verbindet die Werte ohne Trenner. |
Rückgabewert
separator. Liefert der Iterator keine Werte, ist das Ergebnis ein leerer String "".Beispiele
Generator-Werte verbinden (mit Fallback)
function* farben() {
yield 'rot';
yield 'grün';
yield 'blau';
}
// Funktionsprüfung: native Methode oder Fallback über Array.from()
const joinIter = (it, sep) =>
typeof it.join === 'function' ? it.join(sep) : Array.from(it).join(sep);
console.log(joinIter(farben()));
console.log(joinIter(farben(), ' | '));
Iterator-Helfer verketten, ohne Zwischen-Array
const preise = new Map([
['Kaffee', 2.5],
['Tee', 1.8],
['Kakao', 3.2]
]);
const it = preise.entries()
.filter(([, preis]) => preis > 2)
.map(([name, preis]) => `${name}: ${preis.toFixed(2)} €`);
const text = typeof it.join === 'function'
? it.join('\n')
: Array.from(it).join('\n');
console.log(text);
Unendlichen Iterator begrenzen und Verbrauch beachten
function* zaehler() {
let n = 1;
while (true) yield n++;
}
const ersteFuenf = zaehler().take(5);
const join = (it, sep) =>
typeof it.join === 'function' ? it.join(sep) : Array.from(it).join(sep);
console.log(join(ersteFuenf, '-'));
// Der Iterator ist jetzt verbraucht:
console.log(JSON.stringify(join(ersteFuenf, '-')));
// Wichtig · Fallstricke
- Kompatibilität:
Iterator.prototype.join()ist ein TC39-Vorschlag und gehört noch nicht zum Standard. Es gibt die Methode nur in wenigen Engines. Prüfe vor dem Aufruf mittypeof it.join === 'function', ob sie vorhanden ist, und nutze sonstArray.from(it).join(sep)oder[...it].join(sep). Die Iterator-Helfermap(),filter()undtake()aus den Beispielen gibt es erst ab ES2025 bzw. in aktuellen Browsern und Node.js 22+. - Verbrauch: Nach
join()ist der Iterator erschöpft. Ein zweiter Aufruf liefert"". - Unendliche Iteratoren: Ohne
take()oder eine andere Begrenzung endet der Aufruf nie und blockiert den Thread. - Umwandlung in Strings: Die Werte werden wie bei
Array.prototype.join()in Strings umgewandelt. Objekte ergeben ohne eigenestoString()den Text"[object Object]". Obnullundundefinedwie bei Arrays zu leeren Strings werden, kann sich mit dem Stand des Vorschlags noch ändern. - Die Methode gibt es nur auf echten Iterator-Objekten, die von
Iterator.prototypeerben. Reine Iterables wie Arrays, Strings oder Sets haben sie nicht direkt; wandle sie zuerst mit.values()oderIterator.from()um.