首页 > 解决方案 > 在生成器上使用扩展语法时,为什么没有检索到返回值

问题描述

我原以为 4 会成为序列数组的一部分,那么为什么会跳过它呢?

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

标签: javascriptecmascript-6functional-programminggeneratorspread-syntax

解决方案


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

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

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

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

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


推荐阅读