生成器函数返回迭代器对象,而非直接返回{value, done};调用其next()方法才逐步获取含value和done属性的对象,done为false表示可继续产出,true表示执行完毕。

JavaScript 中生成器函数本身不直接返回带 done 状态的对象,而是通过调用其返回的迭代器对象的 next() 方法,逐步获取包含 value 和 done 属性的对象。
生成器函数返回迭代器,不是直接返回 {value, done}
当你定义并调用一个生成器函数(如 function* gen() { ... }),它返回的是一个迭代器对象,而不是单个 {value, done} 对象。这个迭代器对象的 next() 方法才真正返回形如 {value: ..., done: true/false} 的结果。
-
done: false表示还有更多值可产出,value是当前 yield 的值 -
done: true表示生成器已执行完毕(遇到return、抛出异常或自然结束),此时value是 return 的值(或undefined)
手动调用 next() 获取 done 状态
每次调用 iterator.next() 都会推进生成器执行到下一个 yield 或结束点:
function* numbers() {
yield 1;
yield 2;
return 'done';
}
<p>const it = numbers();
console.log(it.next()); // { value: 1, done: false }
console.log(it.next()); // { value: 2, done: false }
console.log(it.next()); // { value: 'done', done: true }
console.log(it.next()); // { value: undefined, done: true }(后续调用始终返回 done: true)注意 return 和 throw 对 done 的影响
return 和提前 throw 都会让下一次 next() 返回 done: true:
立即学习“Java免费学习笔记(深入)”;
-
return 42→{value: 42, done: true} -
throw new Error('oops')→ 下次next()不会返回,而是抛出该错误;若用it.throw()触发,则可能让生成器提前结束并返回done: true(取决于内部逻辑)
for...of 自动处理 done,无需手动判断
for...of 内部自动调用 next() 并在 done: true 时停止,所以你通常不需要显式检查 done:
for (const n of numbers()) {
console.log(n); // 只输出 1 和 2,不输出 'done'
}这是因为 for...of 忽略 return 的值(即 done: true 时的 value),只遍历 yield 的值。


















