yield暂停生成器并返回{value, done: false},return终结迭代并返回{value, done: true};显式return的值作为终值,yield无法提供终值语义。

yield 和 return 在迭代终止时的返回值表现完全不同:前者让生成器“暂停并交出控制权”,后者让函数“彻底结束并交出最终值”。这个差异直接影响迭代器最后一次 next() 调用的返回结构。
yield 不会触发 done: true,return 才会标记迭代完成
每次遇到 yield,生成器暂停执行,返回 { value: ..., done: false };只有执行到 return(或函数自然结束),才会返回 done: true 的结果。
-
function* g() { yield 1; yield 2; }—— 第三次调用next()返回{ value: undefined, done: true }(隐式 return) -
function* g() { yield 1; return 42; }—— 第二次调用next()返回{ value: 42, done: true }
return 的值成为迭代器的最终 value
显式 return 后的值,会作为最后一次 next() 调用的 value 字段内容,且 done 变为 true。这和 yield 返回的中间值性质不同——它代表整个迭代过程的收尾结果。
function* gen() { yield 'a'; return 'end'; }const it = gen(); it.next(); // { value: 'a', done: false }it.next(); // { value: 'end', done: true }
yield 无法提供“终值语义”,return 可以明确终结并携带数据
仅靠 yield 无法在迭代结束时传递有意义的结束信号或元数据。比如你想告诉调用方“本次生成共产出 5 个数,总和是 15”,这个汇总信息只能通过 return 传出。
立即学习“Java免费学习笔记(深入)”;
function* countWithSum(n) { let sum = 0; for (let i = 0; i- 遍历完所有
yield后,next()就能拿到{ count: n, total: sum }这个结构化终值
隐式 return 与显式 return 的 value 表现一致
函数末尾没有 return,等价于 return undefined。所以自然结束的生成器,最后一次 next() 仍返回 { value: undefined, done: true },和写 return; 效果相同。
- 这说明
done: true总是伴随一个value,哪怕它是undefined - 而所有
yield产生的value都出现在done: false的响应中


















