浅谈ES6中的迭代器和生成器

迭代器

背景知识

1.什么是迭代
从一个数据集合中按照一定的顺序,不断的取出数据的过程
2.迭代和遍历的区别
迭代 :强调的是依次取出数据,并不保证取多少,即可以不知道数据的总个数,也不保证把所有的数据全部取完。遍历:强调的是要把整个数据依次全部取出
3.迭代模式
一种设计模式,用于同一迭代过程,并规范了迭代器的规格
-迭代器应该具有得到下一个数据的能力,以及判断是否还有后续数据的能力

什么是迭代器

JS规定,如果一个对象具有next方法,并且该方法返回一个对象,返回的对象格式如下

var obj = {
	next(){   // 用于得到下一个数据
		return{
			value:number  // 下一个数据的值
			done: boolean  // 是否迭代完成
		}	
	}
}

可迭代协议

可迭代协议:如果一个对象具有知名符号属性 [Symblo.iterator],并且该属性值是一个迭代器创建函数,则该对象是一个可迭代的对象

For of 循环

如何遍历可迭代对象

	const arr = [1,2,3,4,5]  //数组就是一个可迭代对象
	const iterator = arr[Symbol.iterator]();  // 得到一个迭代器
	const result = iterator.next(); // 得到第一个数据
	while(!result.done){
		const item = result.value  //把值赋给item
		console.log(item)  
		result = iterator.next();  // 得到下一个数据
	}

For of 循环
一种语法糖,内部会调用上面的next方法

	for (const item of arr){
		console,log(item)  //item 等于 上述的result.value
	}

生成器

最初的目的是为了更加方便的书写迭代器

什么是生成器

生成器是一个通过构造函数Generator(只能浏览器内部调用使用)创建的对象,生成器既是一个迭代器,同时又是一个可迭代的对象

如何创建一个生成器

必须使用生成器创建函数(Generator Function)

如何书写一个生成器函数

在函数名称前加个*符号,该函数一定返回一个生成器
	function *method(){
		console.log(1)
	}

生成器函数内部是如何实现的

有意思的地方是 : 调用method(),并不会执行函数内部的代码,只是得到一个生成器
生成器函数内部是为了给生成器每次迭代提供数据的,这就是说,我们可以在函数外部控制函数里面代码的执行
每次调用生成器的next方法,将让生成器运行到下一个关键字yeild的位置
yeild是一个关键字,该关键字只能在生成器函数内部使用,表示产生一个迭代数据

	function *method(){
		yeild 1;
		yeild 2
	}
	const iterator = method() // 得到一个生成器
	const result = iterator.next() // 进行迭代
	console.log(result)  // 1

补充:生成器还可以于异步操作,替代Promise中的async 和await

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值