当前位置: 首页 > 后端技术 > Node.js

[ES6]迭代器和可迭代对象

时间:2023-04-04 00:04:46 Node.js

ES6新的数组方法、集合、for-of循??环、展开运算符(...)甚至异步编程都依赖于迭代器(Iterator)实现。本文将详细讲解ES6的迭代器和生成器,并进一步深挖可迭代对象的内部原理和使用方法1.迭代器的原理在编程语言中处理数组或集合时,必须初始化一个变量来记录迭代位置使用循环语句和迭代器的编程使用可以简化这种数据操作。如何设计一个迭代器?迭代器本身是一个对象。这个对象有一个next()方法来返回结果对象。这个结果对象有下一个返回值和迭代完成布尔值done。模拟创建了一个简单的迭代器,如下所示:iterms[i++]:undefinedreturn{done,value}}}}letarrayIterator=createIterator([1,2,3])console.log(arrayIterator.next())//{done:false,value:1}控制台.log(arrayIterator.next())//{done:false,value:2}console.log(arrayIterator.next())//{done:false,value:3}console.log(arrayIterator.next())//{done:true,value:undefined}如果你对上面的语法感到困惑,请参考:[ES6]对象的新函数和解构赋值每次调用迭代器的next()都会返回下一个对象,直到数据集耗尽。ES6中迭代器的编写规则类似,但是引入了生成器对象,使得创建迭代器对象更加容易。2.创建迭代器ES6封装了一个生成器(generator)来创建迭代器。显然,生成器是一个返回迭代器的函数,迭代器在函数后用星号(*)表示,并使用新的内部专用关键字yield来指定迭代器的next()方法的返回值。如何使用ES6生成器创建迭代器?一个简单的例子如下:function*createIterator(){yield123;yield'someValue'}letsomeIterator=createIterator()console.log(someIterator.next())//{value:123,done:false}console.log(someIterator.next())//{value:'someValue',done:false}console.log(someIterator.next())//{value:undefined,done:true}使用yield关键字返回任意值或Expression,可以批量向迭代器添加元素://letcreateIterator=function*(items){//生成器函数表达式function*createIterator(items){for(leti=0;i'jenny','id'=>123}console.log(...map)//['name','jenny']['id',123]letnum1=[1,2,3],num2=[7,8,9]console.log([...num1,...num2])//[1,2,3,7,8,9]letudfconsole.log(...udf)//TypeError:undefinedisnotiterable从上面的代码可以看出,展开运算符(...)方便地将可迭代对象转换为数组。和for-of一样,展开运算符(...)用在不可迭代对象,null或undefined上都会报错!4、默认迭代器ES6为很多内置对象提供了默认迭代器,只有当内置迭代器不能满足要求时,才自己创建迭代器。ES6的三个集合对象:Set、Map、Array都有默认的迭代器。常用的方法如values()和entries()返回一个迭代器,它们的取值区别如下:集合,调用上面的方法获取集合的迭代器,并使用for-of循环,示例如下:/********Map*********/letmap=newMap([['name','jenny'],['id',123]])for(letitemofmap.entries()){console.log(item)//['name','jenny']['id',123]}for(letitemofmap.keys()){console.log(item)//nameid}for(letitemofmap.values()){console.log(item)//jenny123}/********Set*************/letset=newSet([1,4,4,5,5,5,6,6,])for(letitemofset.entries()){console.log(item)//[1,1][4,4][5,5][6,6]}/********数组***********/letarray=[11,22,33]for(letitemofarray.entries()){console.log(item)//[0,11][1,22][2,33]}此外,String和NodeList类型都有默认的迭代器。虽然没有提供其他方法,但是还是推荐使用for-of循环阅读《深入理解ES6》加油~小子!