何为迭代器?
迭代器是被设计专用于迭代的对象,带有特定接口。所有的迭代器对象都拥有 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
还提供了生成器,让创建迭代器对象变得更简单。