JS中的迭代器和生成器 (生成器)

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}

今天的分享就到这里,如果有什么不清楚明白的可以私信我,如果文章哪里有什么不对的地方,还望大神指教,相互促进

再见,下一章再见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值