产量*

这个产量*运算符用于委托给另一个可迭代的对象,例如发电机.

试试看

语法

js公司
产量*表达式

参数

表达 可选

一个可迭代的对象。

返回值

当迭代器关闭时(当完成真的).

描述

这个产量*表达式对操作数进行迭代,并生成它返回的每个值。它将当前生成器的迭代委托给底层迭代器,我们将其分别称为“生成器”和“迭代器”。产量*首先通过调用操作数的迭代器从操作数中获取迭代器[符号迭代器]()方法。然后,每次next()调用生成器的方法,产量*调用迭代器的next()方法,传递生成器接收到的参数next()方法(始终未定义对于第一个调用),并生成与迭代器返回的结果对象相同的结果对象next()方法。如果迭代器结果有完成:true,然后是产量*表达式停止执行并返回价值这样的结果。

这个产量*操作员转发当前生成器的throw()返回()方法的基础迭代器。如果当前生成器通过这些方法之一过早关闭,则会通知底层迭代器。如果发电机throw()/返回()方法,则throw()/返回()使用相同的参数调用底层迭代器的方法。的返回值throw()/返回()处理方式与next()方法的结果,如果方法抛出,则从产量*表达式。

如果底层迭代器没有return()(返回)方法产量*表达式变成返回语句,就像调用return()(返回)在一个暂停产量表达式。

如果底层迭代器没有throw()方法,这会导致产量*扔一个类型错误–但在抛出错误之前,底层迭代器的返回()如果存在,则调用方法。

示例

授权给另一个发电机

在下面的代码中,由g1()从返回next()就像那些g2().

js公司
函数*g1(){产量2;产量3;产量4;}函数*g2(){产量1;产量*g1();产量5;}常数gen=g2();console.log(gen.next());//{value:1,done:false}console.log(gen.next());//{value:2,done:false}console.log(gen.next());//{value:3,done:false}console.log(gen.next());//{值:4,完成:false}console.log(gen.next());//{value:5,done:false}console.log(gen.next());//{value:未定义,已完成:true}

其他Iterable对象

除了生成器对象之外,产量*也可以产量其他种类可迭代项(例如,数组、字符串或论据对象)。

js公司
函数*g3(…args){产量*[1,2];产量*“34”;产量*args;}常数gen=g3(5,6);console.log(gen.next());//{value:1,done:false}console.log(gen.next());//{value:2,done:false}console.log(gen.next());//{值:“3”,完成:false}console.log(gen.next());//{值:“4”,完成:false}console.log(gen.next());//{value:5,done:false}console.log(gen.next());//{值:6,完成:false}console.log(gen.next());//{value:未定义,已完成:true}

yield*表达式本身的值

产量*是表达式,而不是语句,因此它的计算结果为值。

js公司
函数*g4(){产量*1,2,3];return“foo”;}函数*g5(){const g4ReturnValue=产量*g4();console.log(g4ReturnValue);//'foo'返回g4ReturnValue;}常数gen=g5();console.log(gen.next());//{value:1,done:false}console.log(gen.next());//{value:2,done:false}console.log(gen.next());//{value:3,done:false}done为false,因为g5生成器尚未完成,只有g4console.log(gen.next());//{value:“foo”,完成:true}

方法转发

这个next(),throw()、和return()(返回)当前生成器的方法都被转发到底层迭代器。

js公司
常量可迭代={[符号迭代器](){让计数=0;返回{下一个(v){console.log(“next called with”,v);计数++;返回{value:count,done:false};},返回(v){console.log(“return called with”,v);return{value:“iterable return value”,done:true};},抛出(v){console.log(“throw called with”,v);返回{value:“iterable thrown value”,完成:true};},};},};函数*gf(){yield*可迭代;return“gf返回值”;}常数gen=gf();控制台.log(gen.next(10));//下一次调用时未定义;第一个next()调用的参数总是被忽略//{value:1,done:false}控制台.log(gen.next(20));//下一个调用为20//{value:2,done:false}console.log(gen.return(30));//用30调用返回//{value:'可迭代返回值',done:true}控制台.log(gen.next(40));//{value:未定义,已完成:true};发电机已关闭常数gen2=gf();console.log(gen2.next(10));//next调用时未定义//{value:1,done:false}控制台.log(gen2.throw(50));//掷50分//{value:“gf返回值”,完成:true}控制台.log(gen.next(60));//{value:未定义,done:true};发电机已关闭

如果返回()/throw()底层迭代器返回的方法完成:false,电流发生器继续执行产量*继续委托给底层迭代器。

js公司
常量可迭代={[符号迭代器](){让计数=0;返回{下一个(v){console.log(“next called with”,v);计数++;返回{value:count,done:false};},返回(v){console.log(“return called with”,v);return{value:“可迭代的return value”,done:false};},};},};函数*gf(){产量*可迭代;return“gf返回值”;}常数gen=gf();控制台.log(gen.next(10));//next调用时未定义//{value:1,done:false}console.log(gen.return(20));//用20调用返回//{value:'可迭代返回值',done:false}控制台.log(gen.next(30));//{value:2,done:false};发电机未关闭

如果底层迭代器没有throw()方法和生成器throw()被称为,产量*抛出错误。

js公司
常量可迭代={[符号迭代器](){让计数=0;返回{下一个(v){计数++;返回{value:count,done:false};},};},};函数*gf(){产量*可迭代;return“gf返回值”;}const gen=gf();gen.next();//First next()启动yield*表达式发电机(20);//TypeError:迭代器不提供“throw”方法。

规格

规范
ECMAScript语言规范
#第二代函数定义运行时语义评估

浏览器兼容性

BCD表仅在浏览器中加载

另请参见