## 错误信息

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

## 错误类型

`TypeError`

## 发生了什么错误?

这个值作为 for…of 的表达式右值，或者作为一个函数的参数，如 `Promise.all` 或者 `TypedArray.from`, 不是一个 可迭代对象. 一个可迭代对象可以是一个内置可迭代类型，如`Array`, `String` 或 `Map`, 一个 generator 生成结果, 或者一个实现了 可迭代协议 的对象

## 示例

### Iterating over Object properties

在JavaScript中, `Object` 是不可迭代的，除非它们实现了迭代协议. 因此, 你不能使用 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' };
    // 迭代属性名称:
    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);

这次case的另外一个选择是使用 `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);

### Iterating over a generator

Generators 是用来生成可迭代对象的函数.

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

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

当它没有被调用, 这个 `Function` 相应的是可调用的，但是不可迭代。 调用 generator 生成一个可迭代对象，该对象将迭代在生成器执行期间生成的值.

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

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

## 参阅

- iterable protocol
- `Object.keys`
- `Object.entries`
- `Map`
- generators
- for…of