在生成器上使用扩展语法时,为什么未检索到 return 值

When using spread syntax on a generator why return value is not retrieved

我原以为 4 是序列数组的一部分,为什么它被跳过了?

function* generate() {
  yield 1;
  yield 2;
  yield 3;
  return 4
}
let sequence = [...generate()];
console.log(sequence); // 1, 2, 3

生成器函数的 return 值不被视为序列的一部分。它是 return 从上次 .next() 调用中编辑为 {done: true, value:…},其中 done: true 表示序列已完成,不应再次调用 .next()

为什么会这样,为什么我们不能在 done 标志设置为 true 的情况下生成最后一个值?因为那时我们无法用迭代器表示 empty 序列 - 第一个 .next() 调用已经导致至少一个值。1

所以通常,生成器函数不会 return 任何东西(但 undefined),并且所有序列值都使用相同的语法生成 - 最后一个值没有奇怪的特殊语法2:

function* generate() {
  yield 1;
  yield 2;
  yield 3;
  yield 4;
}

1: 其他语言的做法不同。在那里,迭代器有一个单独的 .hasNext() 方法,称为 before .next(),或者它们的 .next() 方法要么 return 是一个值,要么抛出StopIteration 异常。他们没有任何“最终价值”。
2:必须事先知道最后一个值并使用 return 而不是 yield 因为它会使动态生成序列的逻辑更加复杂。