在Generator函数中,yield
表达式是一个委托给另一个Generator函数或可迭代对象的语法。当在Generator函数内部使用 yield
时,它会将控制权交给另一个Generator函数或可迭代对象,并返回该对象产生的所有值,直到它完成。
文末有我帮助400多位同学成功领取到前端offer的场景题哦
yield
表达式的用途主要有两个:
- 委托给另一个Generator函数:这允许你将一个Generator函数的实现细节隐藏在一个单独的函数中,并在主Generator函数中通过
yield
来使用它。这可以提高代码的可读性和可维护性。 - 迭代一个可迭代对象:如果你有一个数组、字符串或其他可迭代对象,并希望在一个Generator函数中逐个产生它的值,你可以使用
yield
来委托给该对象的迭代器。
下面是一个使用 yield*
表达式的示例:
function* numbers() {
yield 1;
yield 2;
yield 3;
}
function* generatorWithDelegation() {
yield 'a';
yield* numbers(); // 委托给numbers() Generator函数
yield 'b';
}
const iterator = generatorWithDelegation();
console.log(iterator.next().value); // 输出:'a'
console.log(iterator.next().value); // 输出:1(来自numbers())
console.log(iterator.next().value); // 输出:2(来自numbers())
console.log(iterator.next().value); // 输出:3(来自numbers())
console.log(iterator.next().value); // 输出:'b'
在上面的示例中,generatorWithDelegation
是一个Generator函数,它使用 yield*
来委托给 numbers
Generator函数。当 iterator.next()
被调用时,它首先产生 'a'
,然后委托给 numbers
函数,产生 1
、2
和 3
,最后产生 'b'
。
此外,yield
也可以用于委托给可迭代对象,如数组或字符串:
function* arrayDelegation() {
yield 'start';
yield* [1, 2, 3]; // 委托给数组
yield 'end';
}
const iterator = arrayDelegation();
console.log(iterator.next().value); // 输出:'start'
console.log(iterator.next().value); // 输出:1(来自数组)
console.log(iterator.next().value); // 输出:2(来自数组)
console.log(iterator.next().value); // 输出:3(来自数组)
console.log(iterator.next().value); // 输出:'end'