You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript Generator 行为困惑:next(true)为何输出0而非3?

为什么调用生成器的next(true)返回0而非预期的3?

先还原你遇到的生成器代码(对应原示例逻辑):

function* takeANumber() {
  let num = 0;
  while (true) {
    let reset = yield num++;
    if (reset) {
      num = 0;
    }
  }
}

const gen = takeANumber();
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next(true).value); // 0(你预期3)
console.log(gen.next().value); // 1

核心原因在于ES6生成器中yield的执行逻辑和next()传参的作用:

  • yield num++是先返回当前num值,再执行num自增。
  • 调用next(参数)时,这个参数会被赋值给上一次执行的yield表达式的返回值,而非直接控制当前要返回的value。

拆解每一步的执行流程:

  1. 第一次gen.next():执行到yield num++,返回num=0,随后num自增为1。
  2. 第二次gen.next():从上次yield的位置继续,reset被赋值为undefined(无传参),不触发重置,继续到下一个yield,返回num=1,num自增为2。
  3. 第三次gen.next():继续执行,reset=undefined,到yield返回num=2,num自增为3。
  4. 第四次gen.next(true):从上次yield的位置继续,reset被赋值为true,触发num=0的重置。随后进入下一轮循环,执行到yield num++,返回当前num=0,再自增为1。
  5. 第五次gen.next():返回num=1,自增为2。

这就是为什么第四次调用返回0而非3——next(true)的参数触发了num的重置,而此时要返回的是重置后的num值。

内容的提问来源于stack exchange,提问作者Sinister

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:42:12