javascript - 在生成器上使用扩展语法时,为什么没有检索到返回值
问题描述
我原以为 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
所以通常,生成器函数不返回任何东西(但是),并且所有序列值都使用相同的语法产生 - 最后一个值2undefined
没有奇怪的特殊语法:
function* generate() {
yield 1;
yield 2;
yield 3;
yield 4;
}
1:其他语言的做法不同。在那里,迭代器有一个单独的方法,在之前.hasNext()
调用,或者它们的方法要么返回一个值,要么抛出一个异常。它们没有任何“最终价值”。
2:必须事先知道一个值是最后一个值并使用它而不是
for 它会使动态生成的序列的逻辑更加复杂。 .next()
.next()
StopIteration
return
yield
推荐阅读
- android - Flutter -> Persistent 底部导航栏如何退出
- python - 使用 pybind11 将 Python 成员函数添加到 C++ 类
- microsoft-graph-api - 将实时消息从 MS Teams 导出到另一个 Office 应用程序
- angular-ui-router - Nativescript 找不到模块“@nativescript/angular/router”
- c - 有没有办法在 C 中一次获取一个字符?
- flutter - Gif 加载颤振
- java - TextLocal Java API 模板消息错误 80
- pandas - 使用 NaNs Python 对连续特征进行二值化
- java - 当 Java 对象即将完成/终止时调用 C 函数(在 SWIG 中)
- r - 不知道我在做什么——你能以某种方式使用 cut() 函数而不丢失数据值吗?