1.什么是迭代 从一个数据集合中按照一定的顺序,不断的取出数据的过程 2.迭代和遍历的区别 迭代 :强调的是依次取出数据,并不保证取多少,即可以不知道数据的总个数,也不保证把所有的数据全部取完。遍历:强调的是要把整个数据依次全部取出 3.迭代模式 一种设计模式,用于同一迭代过程,并规范了迭代器的规格 -迭代器应该具有得到下一个数据的能力,以及判断是否还有后续数据的能力
JS规定,如果一个对象具有next方法,并且该方法返回一个对象,返回的对象格式如下
var obj = { next(){ // 用于得到下一个数据 return{ value:number // 下一个数据的值 done: boolean // 是否迭代完成 } } }可迭代协议:如果一个对象具有知名符号属性 [Symblo.iterator],并且该属性值是一个迭代器创建函数,则该对象是一个可迭代的对象
如何遍历可迭代对象
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)
有意思的地方是 : 调用method(),并不会执行函数内部的代码,只是得到一个生成器 生成器函数内部是为了给生成器每次迭代提供数据的,这就是说,我们可以在函数外部控制函数里面代码的执行 每次调用生成器的next方法,将让生成器运行到下一个关键字yeild的位置 yeild是一个关键字,该关键字只能在生成器函数内部使用,表示产生一个迭代数据
function method(){ yeild 1; yeild 2 } const iterator = method() // 得到一个生成器 const result = iterator.next() // 进行迭代 console.log(result) // 1补充:生成器还可以于异步操作,替代Promise中的async 和await