Page 157 - 你不知道的JavaScript(下卷)
P. 157
当然,可以有意地把迭代器设计为在返回 done: true 的同时返回一些相关
值。但除非已经写了文档表明这一点,以此迫使迭代器的消费者使用不同的
迭代模式,而不是像 for..of 或者其等价手动 for 形式暗示的那样,否则不
要这么做。
3.1.5 自定义迭代器
除了标准的内置迭代器,你也可以构造自己的迭代器!要使得它们能够与 ES6 的消费者工
具(比如,for..of 循环以及 ... 运算符)互操作,所需要做的就是使其遵循适当的接口。
让我们试着构造一个迭代器来产生一个无限斐波纳契序列:
var Fib = {
[Symbol.iterator]() {
var n1 = 1, n2 = 1;
return {
// 使迭代器成为iterable
[Symbol.iterator]() { return this; },
next() {
var current = n2;
n2 = n1;
n1 = n1 + current;
return { value: current, done: false };
},
return(v) {
console.log(
"Fibonacci sequence abandoned."
);
return { value: v, done: true };
}
};
}
};
for (var v of Fib) {
console.log( v );
if (v > 50) break;
}
// 1 1 2 3 5 8 13 21 34 55
// Fibonacci sequence abandoned.
如果我们没有插入 break 条件的话,这个 for..of 循环就会无限循环下去,
这可能不是你想要的结果。
134 | 第 3 章
图灵社区会员 avilang(1985945885@qq.com) 专享 尊重版权