什么是生成器?
生成器是一个通过构造函数Generator创建的对象,它既是一个迭代器,又是一个可迭代对象。方便我们得到一个迭代器。
怎么创建生成器?
必须使用生成器函数创建
怎么书写生成器函数?
function* test(){
}
//该函数一定返回一个生成器,*必须有,可以没有名字和function关键字
生成器函数的内部执行
生成器函数内部是为了给生成器每次迭代提供数据,每次调用生成器的next方法,将导致生成器函数运行到下一个yield关键字位置。yield用于产生一个迭代数据。
注意
- 生成器函数可以有返回值,返回值出现在第一次done为true的value属性中
- 调用next方法时,可以传递参数,会交给yield表达式的返回值
- 第一次调用next函数传递参数没有意义
- 在生成器函数内部可以调用其他生成器函数,需要加上*
例子
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方法:调用该方法,可以在生成器中产生一个错误。