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

tech2023-02-11  116

文章目录

迭代器背景知识什么是迭代器可迭代协议For of 循环 生成器什么是生成器如何创建一个生成器如何书写一个生成器函数生成器函数内部是如何实现的

迭代器

背景知识

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)