Page 159 - 你不知道的JavaScript(下卷)
P. 159
}
);
var it = tasks[Symbol.iterator]();
it.next( 10 ); // step 1: 10
// { value: 20, done: false }
it.next( 20, 50 ); // step 2: 20 50
// { value: 120, done: false }
it.next( 20, 50, 120 ); // step 3: 20 50 120
// { value: 1120, done: false }
it.next(); // { done: true }
这种特定的用法强调了迭代器可以作为一个模式来组织功能,而不仅仅是数据。下一小节
我们介绍生成器时也可以回顾一下这里。
你甚至可以创造性地定义一个迭代器来表示单个数据上的元操作。举例来说,我们可以为
数字定义一个迭代器,默认范围是从 0 到(或者对于负数来说,向下到)关注的数字。
考虑:
if (!Number.prototype[Symbol.iterator]) {
Object.defineProperty(
Number.prototype,
Symbol.iterator,
{
writable: true,
configurable: true,
enumerable: false,
value: function iterator(){
var i, inc, done = false, top = +this;
// 正向还是反向迭代?
inc = 1 * (top < 0 ? -1 : 1);
return {
// 使得迭代器本身成为iterable!
[Symbol.iterator](){ return this; },
next() {
if (!done) {
// 初始迭代总是0
if (i == null){
i = 0;
}
// 正向迭代
else if (top >= 0) {
i = Math.min(top,i + inc);
}
136 | 第 3 章
图灵社区会员 avilang(1985945885@qq.com) 专享 尊重版权