Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
TypeError: 'x' ist nicht iterierbar
Die JavaScript-Ausnahme "ist nicht iterierbar" tritt auf, wenn der Wert, der in ein Array oder einen Funktionsaufrufgespreadet wird, als rechte Seite infor...of, als Argument einer Funktion wiePromise.all oderSet(), oder als rechte Seite bei einer Array-Destrukturierung angegeben wird, keiniterierbares Objekt ist. Dieser Fehler tritt auch auf, wennArray.fromAsync() oderfor await...of mit einemnicht-asynchronen Iterierbaren verwendet wird.
In diesem Artikel
Nachricht
TypeError: Spread syntax requires ...iterable[Symbol.iterator] to be a function (V8-based & Safari)TypeError: %Array%.from requires that the property of the first argument, items[Symbol.iterator], when exists, be a function (V8-based & Safari)TypeError: Array.fromAsync requires that the property of the first argument, items[Symbol.asyncIterator], when exists, be a function (V8-based & Safari)TypeError: object is not iterable (cannot read property Symbol(Symbol.iterator)) (V8-based)TypeError: x is not async iterable (V8-based)TypeError: x is not iterable (V8-based & Firefox)TypeError: undefined is not a function (near '...y of x...') (Safari)TypeError: Array.from: no function (Safari)TypeError: Type error (Safari)
Fehlertyp
TypeErrorWas ist schiefgelaufen?
Der Wert, der in ein Array oder einen Funktionsaufrufgespreadet wird, als rechte Seite infor...of, oder als Argument einer Funktion wiePromise.all oderSet(), oder als Quelle eines Array-Destrukturierungsmusters angegeben wird, ist keiniterierbares Objekt. Ein iterierbares Objekt kann ein eingebauter iterierbarer Typ wieArray,String oderMap, ein Generatorergebnis oder ein Objekt sein, das dasiterierbare Protokoll implementiert.
const nonIterable1 = {};const nonIterable2 = { [Symbol.iterator]: 1 };[...nonIterable1];Math.max(...nonIterable1);for (const x of nonIterable1);new Set(nonIterable1);Array.from(nonIterable2);new Int8Array(nonIterable2);const [] = nonIterable1;Beispiele
>Array-Destrukturierung eines nicht-iterierbaren Objekts
const myObj = { arrayOrObjProp1: {}, arrayOrObjProp2: [42] };const { arrayOrObjProp1: [value1], arrayOrObjProp2: [value2],} = myObj; // TypeError: object is not iterableconsole.log(value1, value2);In einigen Laufzeitumgebungen könnte sich herausstellen, dass das nicht-iterierbare Objektundefined ist.
Über Objekteigenschaften iterieren
In JavaScript sindObjecte nicht iterierbar, es sei denn, sie implementieren dasiterierbare Protokoll. Daher können Siefor...of nicht verwenden, um über die Eigenschaften eines Objekts zu iterieren.
const obj = { France: "Paris", England: "London" };for (const p of obj) { // …} // TypeError: obj is not iterableStattdessen müssen SieObject.keys oderObject.entries verwenden, um über die Eigenschaften oder Einträge eines Objekts zu iterieren.
const obj = { France: "Paris", England: "London" };// Iterate over the property names:for (const country of Object.keys(obj)) { const capital = obj[country]; console.log(country, capital);}for (const [country, capital] of Object.entries(obj)) { console.log(country, capital);}Eine andere Möglichkeit für diesen Anwendungsfall könnte die Verwendung einesMap sein:
const map = new Map();map.set("France", "Paris");map.set("England", "London");// Iterate over the property names:for (const country of map.keys()) { const capital = map.get(country); console.log(country, capital);}for (const capital of map.values()) { console.log(capital);}for (const [country, capital] of map.entries()) { console.log(country, capital);}Über einen Generator iterieren
Generatorfunktionen sind Funktionen, die Sie aufrufen, um ein iterierbares Objekt zu erzeugen.
function* generate(a, b) { yield a; yield b;}for (const x of generate) { console.log(x);} // TypeError: generate is not iterableWenn sie nicht aufgerufen werden, ist dasFunction-Objekt, das dem Generator entspricht, aufrufbar, aber nicht iterierbar. Das Aufrufen eines Generators erzeugt ein iterierbares Objekt, das über die während der Ausführung des Generators geernteten Werte iteriert.
function* generate(a, b) { yield a; yield b;}for (const x of generate(1, 2)) { console.log(x);}Über ein benutzerdefiniertes iterierbares Objekt iterieren
Benutzerdefinierte iterierbare Objekte können erstellt werden, indem die MethodeSymbol.iterator implementiert wird. Sie müssen sicherstellen, dass Ihre Iteratormethode ein Objekt zurückgibt, das ein Iterator ist, was bedeutet, dass es einenext-Methode haben muss.
const myEmptyIterable = { [Symbol.iterator]() { return []; // [] is iterable, but it is not an iterator — it has no next method. },};Array.from(myEmptyIterable); // TypeError: myEmptyIterable is not iterableHier ist eine korrekte Implementierung:
const myEmptyIterable = { [Symbol.iterator]() { return [][Symbol.iterator](); },};Array.from(myEmptyIterable); // []