何为迭代器?

迭代器是被设计专用于迭代的对象,带有特定接口。所有的迭代器对象都拥有 next() 方法,会返回一个结果对象。该结果对象有两个属性:对应下一个值的 value,以及一个布尔类型的 done,其值为 true 时表示没有更多值可供使用。迭代器持有一个指向集合位置的内部指针,每当调用了 next() 方法,迭代器就会返回相应的下一个值。

若你在最后一个值返回后再调用 next(),所返回的 done 属性值会是 true,并且 value 属性值会是迭代器自身的返回值(return value,即使用 return 语句明确返回的值)。该 “返回值” 不是原数据集的一部分,却会成为相关数据的最后一个片段,或在迭代器未提供返回值的时候使用 undefined。迭代器自身的返回值类似于函数的返回值,是向调用者返回信息的最后手段。

记住这些后,在 ES5 中创建一个迭代器就相当简单了:

function createIterator(items) {

    var i = 0;

    return {
        next: function() {

            var done = (i >= items.length);
            var value = !done ? items[i++] : undefined;

            return {
                done: done,
                value: value
            };

        }
    };
}

var iterator = createIterator([1, 2, 3]);

console.log(iterator.next());           // "{ value: 1, done: false }"
console.log(iterator.next());           // "{ value: 2, done: false }"
console.log(iterator.next());           // "{ value: 3, done: false }"
console.log(iterator.next());           // "{ value: undefined, done: true }"

// for all further calls
console.log(iterator.next());           // "{ value: undefined, done: true }"
javascript

createIterator() 函数返回一个带有 next() 方法的对象。每当调用此方法时,items 数组的下一个值就会成为所返回的 value 属性的值。当 i 的值为 3 时,done 属性变成 true,并且利用三元运算符将 value 设置为 undefined。这两个结果符合 ES6 迭代器最后的特殊情况,也就是在数据的最后片段被迭代器使用之后、再调用 next() 方法所会返回的结果。

正如此例演示,根据 ES6 制定的规则来书写迭代器,是有一点复杂的。

幸好,ES6 还提供了生成器,让创建迭代器对象变得更简单。