JS中的迭代器和生成器 (生成器)
one. 生成器
one. 什么是生成器?
生成器是通过构造函数Generator创建函数,它既是一个迭代器,也是一个可迭代对象。就是一个对象。
two. 怎么创建生成器?
生成器不能通过构造函数Generator来创建,这种创建方式是Javascript内部自己使用的。如果需要创建应该使用下面代码,*号在function关键字后,在方法名前都可以。
function* test(){
}
function *test(){
}
**注意: 如果*号在function关键字后,在方法名前出现这种形式,那么这个函数就不是一个正常的函数,他返回一个生成器对象。当你调用函数时,这个函数体里面的内容是不会执行的
function* test(){ //我比较喜欢*在后
console.log('控制台输出这串文字');
}
const generator = test(); //不会在执行函数体里面的内容,在控制台打印generator是下面这样的,并不会执行 console.log('控制台输出这串文字');
//19:29:31.069 generator
//19:29:31.069 test {<suspended>}
// [[GeneratorLocation]]: new_file.html:32
// [[Prototype]]: Generator
// [[GeneratorState]]: "suspended"
// [[GeneratorFunction]]: ƒ* test()
// [[GeneratorReceiver]]: Window
// [[Scopes]]: Scopes[3]
那这是怎么回事呢?其实就是生成器内部是如何执行的。
生成器函数内部是为了生成器每次迭代提供的数据,每次调用生成器对象的next方法,将会使生成器函数运行到下一个yield关键字出,而yield关键后面的数据将会是next函数返回结果对象的value值。
举例:没有yield情况
function* test(){ //我比较喜欢*在后
console.log('控制台输出这一串文字');
console.log('控制台输出这二串文字');
console.log('控制台输出这三串文字');
}
const generator = test(); //generator就是一个生成器对象
generator.next();
//19:41:25.671 new_file.html:33 控制台输出这一串文字
//19:41:25.672 new_file.html:34 控制台输出这二串文字
//19:41:25.672 new_file.html:35 控制台输出这三串文字
使用了yield将变成下面这种情况
function* test(){ //我比较喜欢*在后
console.log('控制台输出这一串文字');
yield 1;
console.log('控制台输出这二串文字');
yield 2;
console.log('控制台输出这三串文字');
yield 3;
}
const generator = test(); //generator就是一个生成器对象
// generator.next(); // 控制台输出这一串文字,这里我是在浏览器控制台调用generator.next()的。
19:44:56.669 generator.next();
19:44:56.669 new_file.html:33 控制台输出这一串文字
19:44:56.672 {value: 1, done: false}
需要注意的两点:
生成器函数可以有返回值,该返回值会出现在第一次next函数返回值对象的done为true时value的值。
调用next()方法可以传递参数,该参数会作为下一次yield关键字的返回值
function* test(){ //我比较喜欢*在后
console.log('控制台输出这一串文字');
yield 1;
console.log('控制台输出这二串文字');
return 2;
yield 4;
console.log('控制台输出这三串文字');
yield 3;
}
19:44:56.669 generator.next();
19:44:56.669 new_file.html:33 控制台输出这一串文字
19:44:56.672 {value: 1, done: false}
19:44:56.669 generator.next();
19:44:56.669 new_file.html:33 控制台输出这二串文字
19:44:56.672 {value: 2, done: true}
19:44:56.669 generator.next();
19:44:56.672 {value: undefined, done: true}
function* test(){ //我比较喜欢*在后
console.log('控制台输出这一串文字');
yield 1;
console.log('控制台输出这二串文字');
yield 2;
console.log('控制台输出这三串文字');
yield 3;
}
19:44:56.669 generator.next(10);
19:44:56.669 new_file.html:33 控制台输出这一串文字
19:44:56.672 {value: 1, done: false}
今天的分享就到这里,如果有什么不清楚明白的可以私信我,如果文章哪里有什么不对的地方,还望大神指教,相互促进
再见,下一章再见。