在生成器上使用扩展语法时为什么不检索返回值

Meh*_*oha 7 javascript functional-programming generator ecmascript-6 spread-syntax

我期望 4 成为序列数组的一部分,为什么它被跳过了?

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

Ber*_*rgi 5

生成器函数的值return不被视为序列的一部分。.next()它从最后一次调用返回{done: true, value:\xe2\x80\xa6},其中done: true表示序列已完成并且.next()不应再次调用。

\n

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

\n

因此,通常情况下,生成器函数不会返回任何内容(但是),并且所有序列值都使用相同的语法生成 - 最后一个值2undefined没有奇怪的特殊语法

\n
function* generate() {\n  yield 1;\n  yield 2;\n  yield 3;\n  yield 4;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

1:其他语言的做法有所不同。在那里,迭代器有一个单独的.hasNext()方法,可以在 before .next()调用,或者它们的.next()方法返回一个值或引发StopIteration异常。它们没有任何“最终价值”。
\n2: 必须事先知道某个值是最后一个值并使用return而不是\nyield它会使动态生成序列的逻辑变得更加复杂。

\n