Fehlermeldung
TypeError: 'x' is not iterable (Firefox, Chrome) TypeError: 'x' is not a function or its return value is not iterable (Chrome)
Fehlertyp
Was ist falsch gelaufen?
Der Wert, welcher auf der rechten Seite von for…of oder als Argument einer Funktion wie Promise.all
oder TypedArray.from
ist kein iterierbares Objekt. Ein iterierbares Objekt kann vom Standardtypen wie Array
, String
oder Map
sein oder ein Objekt, welches das iterable Protokoll implementiert.
Beispiele
Über Objekteigenschaften iterieren
In JavaScript sind Objekte
nicht iterierbar, außer sie implementieren das iterable Protokoll. Demnach kann man for…of nicht für das Iterieren von Objekteigenschaften benutzen.
var obj = { 'France': 'Paris', 'England': 'London' };
for (let p of obj) { // TypeError: obj is not iterable
// …
}
Stattdessen kann man Object.keys
oder Object.entries
benutzen, um über die Eigenschaften oder Einträge zu iterieren.
var obj = { 'France': 'Paris', 'England': 'London' };
// Iterate over the property names:
for (let country of obj.keys()) {
var capital = obj[country];
console.log(country, capital);
}
for (const [country, capital] of obj.entries())
console.log(country, capital);
Eine andere Option ist in diesem Fall der Einsatz einer Map
:
var map = new Map;
map.set('France', 'Paris');
map.set('England', 'London');
// Iterate over the property names:
for (let country of map.keys()) {
let capital = map[country];
console.log(country, capital);
}
for (let capital of map.values())
console.log(capital);
for (const [country, capital] of map.entries())
console.log(country, capital);
Über einen Generator iterieren
Generatoren sind Funktionen welche aufgerufen werden, um ein iterierbares Objekt zu produzieren.
function* generate(a, b) {
yield a;
yield b;
}
for (let x of generate) // TypeError: generate is not iterable
console.log(x);
Wenn dieser nicht aufgerufen wird, ist das korrespondierende Function
Objekt des Generators aufrufbar, aber nicht iterierbar. Aufrufen des Generators Produziert ein iterierbares Objekt, welche über die Werte iteriert, die während der Ausführung des Generators zurückgegeben werden.
function* generate(a, b) {
yield a;
yield b;
}
for (let x of generate(1,2))
console.log(x);