TypeError: 'x' is not iterable

메시지

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

에러 타입

TypeError

무엇이 문제인가요?

Promise.all 또는 TypedArray.from 과 같은 함수의 아규먼트 또는 for…of 의 right hand-side 로 주어진 값이 iterable 객체가 아닙니다. iterable 은 Array, String 또는 Map, 생성자 결과, 또는 iterable protocol 구현 객체와 같은 내장 iterable 타입이 될 수 있습니다.

예제

모든 객체 프로퍼티 iterating

JavaScript 에서 iterable protocol 을 구현하지 않은 Object 는 iterable 이 아닙니다.
그러므로, 객체의 프로퍼티를 반복하기 위해 for…of 를 사용하면 안됩니다.

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

객체의 모든 항목 또는 프로퍼티를 반복하려면 대신 Object.keys 또는 Object.entries 를 사용해야 합니다.

var obj = { 'France': 'Paris', 'England': 'London' };
// 모든 프로퍼티 이름을 iterate:
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);


이 유즈 케이스에 대한 다른 옵션은 Map 을 사용하는 것입니다.

var map = new Map;
map.set('France', 'Paris');
map.set('England', 'London');
// 모든 프로퍼티 이름 iterate
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);

Generator iterating

Generators 는 iterable 객체를 생성하기 위해 호출하는 함수입니다.

function* generate(a, b) {
  yield a;
  yield b;
}

for (let x of generate) // TypeError: generate is not iterable
    console.log(x);

generator 가 호출되지 않으면, generator 에 해당하는 Function 객체를 호출할수는 있지만 interable 하지는 않습니다. generator 호출은 generator 실행동안 yield 된 모든 값을 iterate 하는 iterable 객체를 생성합니다.

function* generate(a, b) {
    yield a;
    yield b;
}

for (let x of generate(1,2))
    console.log(x);

함께 보기