问题描述
我期望 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
因为它会使动态生成序列的逻辑复杂得多。