在生成器上使用扩展语法时,为什么未检索到 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
因为它会使动态生成序列的逻辑更加复杂。
我原以为 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
因为它会使动态生成序列的逻辑更加复杂。