Iterator 是一个具有 next() 方法的对象,它返回 { value, done }。如果对象具有 [Symbol.iterator] 方法,则该对象是 iterable — 这就是使 for...of 和 spread 工作的原因。()是创建迭代器的便捷方式,它可以用 。
Iterator 是一个具有 next() 方法的对象,它返回 { value, done }。如果对象具有 [Symbol.iterator] 方法,则该对象是 iterable — 这就是使 for...of 和 spread 工作的原因。()是创建迭代器的便捷方式,它可以用 。
function*yieldfunction* idGenerator() {
let id = 1;
while (true) { // infinite, but lazy — only computes on demand
yield id++; // pause here, return a value, resume on next()
}
}
const gen = idGenerator();
gen.next().value; // 1
gen.next().value; // 2 — execution resumed where it paused
关键思想:每个 yield 处执行暂停,在下一个 .next() 处恢复,保留调用之间的本地状态。在你请求值之前,不会计算任何内容。
// process a huge/infinite sequence without building it all in memory
function* take(iterable, n) {
let i = 0;
for (const x of iterable) {
if (i++ >= n) return;
yield x;
}
}
[...take(idGenerator(), 3)]; // [1, 2, 3] — from an infinite generator
const range = {
from: 1, to: 3,
*[Symbol.iterator]() { for (let i = this.from; i <= this.to; i++) yield i; },
};
[...range]; // [1, 2, 3] — works with for...of and spread
生成器启用了惰性/无限序列、自定义迭代和内存高效的流。
它们也是早期异步库(co)的基础,并支持异步迭代(for await...of)。
迭代器协议是在数组、Map、Set 和字符串中统一 for...of、spread 和解构的东西。