Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. JavaScript
  3. JavaScript-Referenz
  4. JavaScript-Fehlerreferenz
  5. TypeError: 'x' ist nicht iterierbar

Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.

View in EnglishAlways switch to English

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.

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

TypeError

Was 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.

js
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

js
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.

js
const obj = { France: "Paris", England: "London" };for (const p of obj) {  // …} // TypeError: obj is not iterable

Stattdessen müssen SieObject.keys oderObject.entries verwenden, um über die Eigenschaften oder Einträge eines Objekts zu iterieren.

js
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:

js
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.

js
function* generate(a, b) {  yield a;  yield b;}for (const x of generate) {  console.log(x);} // TypeError: generate is not iterable

Wenn 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.

js
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.

js
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 iterable

Hier ist eine korrekte Implementierung:

js
const myEmptyIterable = {  [Symbol.iterator]() {    return [][Symbol.iterator]();  },};Array.from(myEmptyIterable); // []

Siehe auch

Help improve MDN

Learn how to contribute Diese Seite wurde automatisch aus dem Englischen übersetzt.

[8]ページ先頭

©2009-2025 Movatter.jp