es6新增生成器

什么是生成器?

生成器是一个通过构造函数Generator创建的对象,它既是一个迭代器,又是一个可迭代对象。方便我们得到一个迭代器。

怎么创建生成器?

必须使用生成器函数创建

怎么书写生成器函数?

function* test(){

}
//该函数一定返回一个生成器,*必须有,可以没有名字和function关键字

生成器函数的内部执行

生成器函数内部是为了给生成器每次迭代提供数据,每次调用生成器的next方法,将导致生成器函数运行到下一个yield关键字位置。yield用于产生一个迭代数据。

注意

  1. 生成器函数可以有返回值,返回值出现在第一次done为true的value属性中
  2. 调用next方法时,可以传递参数,会交给yield表达式的返回值
  3. 第一次调用next函数传递参数没有意义
  4. 在生成器函数内部可以调用其他生成器函数,需要加上*

例子

1.生成器函数返回生成器

function* test() {
           
}
const generator = test();
console.log(generator);

再次强调,生成器函数一定返回一个生成器,不管它内部有没有内容。
在这里插入图片描述
2.返回的生成器需要迭代,才会执行生成器函数内部的代码

function* test() {
     onsole.log("第1次运行");
     yield 1;
     console.log("第2次运行");
     yield 2;
     console.log("第3次运行");
}
const generator = test();

内部代码根本不执行
在这里插入图片描述

function* test() {
     onsole.log("第1次运行");
     yield 1;
     console.log("第2次运行");
     yield 2;
     console.log("第3次运行");
}
const generator = test();
console.log(generator.next());
console.log(generator.next());
console.log(generator.next());

在这里插入图片描述
3.使用生成器函数遍历数组

const arr1 = [1,2,3,4,5];
const arr2 = [6,7,8,9];
function* createIterator(arr){
      for(const item of arr){
           yield item;
        }
}
const iter1 = createIterator(arr1);
const iter2 = createIterator(arr2);

在这里插入图片描述
这样做,比我们自己创建一个迭代器要轻松太多了。

4.传参

function* test() {
   console.log("第1次运行");
   let info = yield 1;
   console.log(info);
   console.log("第2次运行");
   let info2 = yield 2 + info;
   console.log(info2);
   console.log("第3次运行");
}
const generator = test();

在这里插入图片描述
第一次运行next后,代码卡在了yield 1这个位置,然后第二次调用next(5),把5给了info,所以输出5,然后value=2+5=7,第三次调用next(7)把值给了info2,所以输出7,但是这个时候已经没有yield,所以迭代已经完成。

补充

return方法:调用该方法,可以提前结束生成器函数,提前让迭代过程结束。
throw方法:调用该方法,可以在生成器中产生一个错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值