yield
**yield
** 运算符用于暂停和恢复 生成器函数。
试一试
语法
yield
yield expression
参数
expression
可选-
通过 迭代器协议 从生成器函数生成的返回值。如果省略,则生成
undefined
。
返回值
返回传递给生成器的 next()
方法以恢复其执行的可选值。
注意:这意味着 next()
是不对称的:它始终将值发送到当前挂起的 yield
,但返回下一个 yield
的操作数。传递给第一个 next()
调用的参数无法检索,因为没有当前挂起的 yield
。
描述
yield
关键字会暂停生成器函数的执行,并且 yield
关键字后面的表达式的值将返回给生成器的调用方。可以将其视为 return
关键字的基于生成器的版本。
yield
只能直接在包含它的生成器函数中使用。它不能在嵌套函数中使用。
调用生成器函数会构造一个 Generator
对象。每次调用生成器的 next()
方法时,生成器都会恢复执行,并运行到它到达以下之一:
- 一个
yield
表达式。在这种情况下,生成器会暂停,并且next()
方法返回一个具有两个属性的 迭代器结果 对象:value
和done
。value
属性是yield
运算符后表达式的值,done
为false
,表示生成器函数尚未完全完成。 - 生成器函数的末尾。在这种情况下,生成器的执行结束,并且
next()
方法返回一个迭代器结果对象,其中value
为undefined
且done
为true
。 - 一个
return
语句。在这种情况下,生成器的执行结束,并且next()
方法返回一个迭代器结果对象,其中value
是指定的返回值,done
为true
。 - 一个
throw
语句。在这种情况下,生成器的执行完全停止,并且next()
方法抛出指定的异常。
一旦在 yield
表达式上暂停,生成器的代码执行将保持暂停状态,直到再次调用生成器的 next()
方法。如果将可选值传递给生成器的 next()
方法,则该值将成为生成器当前 yield
操作返回的值。第一次调用 next()
没有对应的挂起 yield
操作,因此无法获取传递给第一次 next()
调用的参数。
如果调用生成器的 return()
或 throw()
方法,则其作用类似于在暂停的 yield
表达式处执行 return
或 throw
语句。可以在生成器函数体中使用 try...catch...finally
来处理这些提前完成的情况。如果调用了 return()
或 throw()
方法,但没有挂起的 yield
表达式(因为尚未调用 next()
,或者因为生成器已完成),则无法处理提前完成的情况,并且始终会终止生成器。
示例
使用 yield
以下代码是示例生成器函数的声明。
function* countAppleSales() {
const saleList = [3, 7, 5];
for (let i = 0; i < saleList.length; i++) {
yield saleList[i];
}
}
定义生成器函数后,可以通过构造迭代器来使用它,如所示。
const appleStore = countAppleSales(); // Generator { }
console.log(appleStore.next()); // { value: 3, done: false }
console.log(appleStore.next()); // { value: 7, done: false }
console.log(appleStore.next()); // { value: 5, done: false }
console.log(appleStore.next()); // { value: undefined, done: true }
您还可以使用 next(value)
将值发送到生成器中。step
评估为 yield
表达式的返回值——尽管传递给生成器 next()
方法的值在第一次调用 next()
时会被忽略。
function* counter(value) {
while (true) {
const step = yield value++;
if (step) {
value += step;
}
}
}
const generatorFunc = counter(0);
console.log(generatorFunc.next().value); // 0
console.log(generatorFunc.next().value); // 1
console.log(generatorFunc.next().value); // 2
console.log(generatorFunc.next().value); // 3
console.log(generatorFunc.next(10).value); // 14
console.log(generatorFunc.next().value); // 15
console.log(generatorFunc.next(10).value); // 26
规范
规范 |
---|
ECMAScript 语言规范 # prod-YieldExpression |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。