为了账号安全,请及时绑定邮箱和手机立即绑定

javascript中的生成器函数

javascript中的生成器函数

慕神8447489 2022-07-08 18:32:03
我是 javascript 新手,无法理解生成器函数的这种行为。为什么它只输出奇数(1,3,5,7,9)?function* numberGen(n){    for (let i=0;i<n;i++){        yield i    }}const num = numberGen(10)while (num.next().value!=undefined){    console.log(num.next().value)}
查看完整描述

3 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

您num.next()在每次迭代中调用两次。您在while()标题中调用它一次以检查结果是否未定义,然后在正文中再次调用它以记录值。每个调用都从生成器中检索下一个项目。因此,您检查偶数项null,并在其后记录奇数项。


相反,您应该将变量分配给单个调用


function* numberGen(n){

    for (let i=0;i<n;i++){

        yield i

    }

}


const num = numberGen(10)

let i;

while ((i = num.next().value) !== undefined){

    console.log(i)

}


.next()您可以使用内置的for-of迭代方法,而不是显式调用该方法。


function* numberGen(n) {

  for (let i = 0; i < n; i++) {

    yield i

  }

}


const num = numberGen(10)

for (let i of num) {

  console.log(i);

}


查看完整回答
反对 回复 2022-07-08
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

.next()您每次迭代调用两次,因此您会跳过所有其他数字。



查看完整回答
反对 回复 2022-07-08
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

在 while 条件检查语句中,您消耗二分之一的值仅用于检查,迭代器是可消耗的,这就是为什么我们只看到奇数,偶数用于真实检查


function* numberGen(n){

    for (let i=0;i<n;i++){

        yield i

    }

}


const num = numberGen(10);


//using spread opertaor to iterate all values

console.log([...num]);


//or you can use forOf 

//for( number of num ){

//  console.log(number);

//}


查看完整回答
反对 回复 2022-07-08
  • 3 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号