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

问题描述

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

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

解决方法

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

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

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...