迭代器
背景知识
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