ECMAScript6规范的新迭代器是一种新的遍历机制,可以更清晰、高效、方便地实现迭代。通过迭代器访问的所有结构都实现了Iterator接口,并且可以在for...of循环中使用。可迭代协议可迭代协议是指能够实现Iterable接口,同时支持迭代的自标识和创建实现Iterator接口的对象的能力。任何实现Iterable接口的对象都有一个Symbol.iterator属性,它引用默认的迭代器。默认的迭代器是一个函数,调用后会产生一个实现了Iterator接口的对象。内置的可迭代对象有String、Array、Map、Set等。这里有几个例子来检查是否有默认的迭代器属性:letobj={};letnum=3;//Object和Number都没有实现迭代器函数console.log(obj[Symbol.iterator]);//undefinedconsole.log(num[Symbol.iterator]);//undefinedletarr=["小明","小李"];letset=newSet().add('小明').add('小李');//Array和Set都实现了迭代器函数console.log(arr[Symbol.iterator]);//[功能:值]console.log(set[Symbol.iterator]);//[Function:values]//获取下面的迭代器console.log(arr[Symbol.iterator]());//对象[数组迭代器]{}console.log(set[Symbol.iterator]());//[SetIterator]{'XiaoMing','XiaoLi'}实际上,实现可迭代协议的可迭代对象可以用于以下场景:for-of循??环数组解构扩展运算符Array.from()setandmap可以由Promise迭代对象组成yield*operatorletarr=["小玲","小霞","小兴","小敏"];//for-of循环for(letvofarr){console.log(v);}//数组解构let[a1,a2,a3,a4]=arr;console.log(a1,a2,a3,a4);//小玲小霞小星小民//扩展运算符letarr2=[...arr];console.log(arr2);//['小玲','小霞','小星','小敏']//Array.from()letarr3=Array.来自(arr);console.log(arr3);//['小玲','小霞','小星','小敏']如果对象原型链上的父类实现了Iterable接口,那么这个对象也会实现Iterable接口:如果对象原型链上的父类实现了Iterable接口,那么这个对象也实现了这个接口:classListextendsArray{}letlist=newList("小玲","小霞","小星","小敏");for(letvoflist1){console.log(v);}//Xiaoling//Xiaoxia//Xiaoxing//XiaominIteratorProtocol迭代器协议定义了生成一系列值的标准方法,一个对象只能成为一个迭代器,如果它实现了next()方法。当对象使用next()遍历数据时,每次成功都会返回一个IteratorResult对象,其中包含迭代返回的下一个值;迭代完所有的值后,会返回一个默认的返回值;如果next()没有被调用,那么就没有办法知道迭代器的当前位置。next()方法返回的IteratorResult包含两个属性:done:布尔值。指示是否也可以调用next()来获取下一个值。当迭代器完成时返回真;否则返回假。value:迭代器返回的值。done为真,可以省略或未定义。可以用下面的简单数组来演示:letarr=["小明","小李"];//获取迭代器letiter=arr[Symbol.iterator]();//执行迭代console.log(iter.next());//{value:'小明',done:false}console.log(iter.next());//{value:'小李',done:false}console.log(iter.next());//{值:未定义,完成:真}console.log(iter.next());//{value:undefined,done:true}迭代时修改了可迭代对象,会在上面的迭代对象中体现出来,如下所示:letarr=["小明","小李"];//获取迭代器让iter=arr[Symbol.iterator]();console.log(iter.next());//{value:'小明',done:false}console.log(iter.next());//{value:'小李',done:false}arr.splice(2,0,"小老虎");控制台.log(iter.next());//{value:'Tiger',done:false}console.log(iter.next());//{值:未定义,完成:真}console.log(iter.next());//{value:undefined,done:true}这是因为使用next()获取对象只是用游标来记录历史。注意:迭代器维护对可迭代对象的引用,因此迭代器会阻止垃圾收集器回收可迭代对象。自定义迭代器因为每个迭代器也实现了Iterable接口,所以它们可以在任何需要迭代的地方使用,例如for-of循??环:每个实现Iterable接口的迭代器都可以在任何可迭代对象中使用,例如for-of循??环.接下来,自定义一个实现迭代器的类:classList{constructor(){this.index=0;this.data=参数;}[Symbol.iterator](){return{next:()=>{if(this.index
