La excepción de JavaScript “no es iterable” ocurre cuando el valor que se da como el lado derecho de para … de o como argumento de una función como Promise.all o TypedArray.from, no es un objeto iterable.

Mensaje

TypeError:'x' is not iterable(Firefox, Chrome)
TypeError:'x' is not a function or its return value is not iterable(Chrome)

Tipo de error

TypeError

¿Qué salió mal?

El valor que se da como el lado derecho de para … de o como argumento de una función como Promise.all o TypedArray.from, no es un objeto iterable. Un iterable puede ser un tipo iterable incorporado, como Array, String o Map, un resultado del generador o un objeto que implementa el protocolo iterable.

Ejemplos de

Iterando sobre las propiedades del objeto

En JavaScript, Objects no son iterables a menos que implementen el protocolo iterable. Por lo tanto, no puede usar para … de para iterar sobre las propiedades de un objeto.

var obj ='France':'Paris','England':'London';for(let p of obj)// TypeError: obj is not iterable// …

En su lugar, tienes que usar Object.keys o Object.entries, para iterar sobre las propiedades o entradas de un objeto.

var obj ='France':'Paris','England':'London';// Iterate over the property names:for(let country of Object.keys(obj))var capital = obj[country];
    console.log(country, capital);for(const[country, capital]of Object.entries(obj))
    console.log(country, capital);

Otra opción para este caso de uso podría ser utilizar un Map:

var map =newMap;
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);

Iterando sobre un generador

Generadores son funciones a las que llama para producir un objeto iterable.

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

Cuando no son llamados, los Function El objeto correspondiente al generador es invocable, pero no iterable. Llamar a un generador produce un objeto iterable que iterará sobre los valores producidos durante la ejecución del generador.

function*generate(a, b)yield a;yield b;for(let x ofgenerate(1,2))
    console.log(x);

Iterando sobre un iterable personalizado

Se pueden crear iterables personalizados implementando el Symbol.iterator método. Debe estar seguro de que su método iterador devuelve un objeto que es un iterador, es decir, debe tener un método siguiente.

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

Aquí hay una implementación correcta:

const myEmptyIterable =[Symbol.iterator]()return[][Symbol.iterator]()

Array.from(myEmptyIterable);// []

Ver también