进阶技巧
迭代器与生成器
Symbol.iterator、Generator yield、异步迭代 for await...of
迭代器与生成器
Symbol.iterator 让任何对象可被 for...of 遍历;Generator 是实现迭代器的最简单方式。
学完本章你将: 掌握 Symbol.iterator、Generator yield、for await...of。
可迭代协议
javascript
// 实现 Symbol.iterator → 可被 for...of 遍历
const range = {
from: 1, to: 5,
[Symbol.iterator]() {
let current = this.from;
return {
next() {
if (current <= 5) return { value: current++, done: false };
return { done: true };
},
};
},
};
for (const n of range) console.log(n); // 1 2 3 4 5
console.log([...range]); // [1, 2, 3, 4, 5]
Generator 函数
javascript
function* fibonacci(limit) {
let [a, b] = [0, 1];
while (a <= limit) {
yield a;
[a, b] = [b, a + b];
}
}
for (const n of fibonacci(50)) console.log(n);
// 0 1 1 2 3 5 8 13 21 34
异步迭代 for await...of
javascript
async function* fetchPages(urls) {
for (const url of urls) {
const resp = await fetch(url);
yield await resp.json();
}
}
for await (const data of fetchPages(["url1", "url2"])) {
console.log(data);
}
yield* 委托
javascript
function* combined() {
yield* [1, 2, 3]; // 委托给可迭代对象
yield* fibonacci(5); // 委托给另一个生成器
yield "end";
}