生成器概念在Java、Python等语言中都是具备的,ES6也添加到了JavaScript中.Iterator可以使我们不需要初始化集合,以及索引的变量,而是使用迭代器对象的一方法,返回集合的下一项的值,偏向程序化。
迭代器是带有特殊接口的对象。含有一个下一个()方法,调用返回一个包含两个属性的对象,分别是价值和完成,价值表示当前位置的值,完成表示是否迭代完,当为真正的时候,调下就用无效了。
ES5中遍历集合通常都是为循环,数组还有forEach方法,对象就是工党,ES6中又添加了映射和集合,而迭代器可以统一处理所有集合数据的方法。迭代器是一个接口,只要你这个数据结构暴露了一个迭代器的接口,那就可以完成迭代.ES6创造了一种新的遍历命令…的循环,迭代器接口主要供的……消费。
<强> 1,默认迭代器接口强>
数据结构只要部署了迭代器接口,我们就成这种数据结构为“可遍历”(Iterable) .ES6规定,默认的迭代器接口部署在数据结构的象征。迭代器属性,或者说,一个数据结构只要具有符号。迭代器数据,就可以认为是“可遍历的”(iterable)。
可以供……的消费的原生数据结构
-
<李> 李>数组
<李> 李>地图
<李> 李>设置
<李>字符串李>
<李> TypedArray(一种通用的固定长度缓冲区类型,允许读取缓冲区中的二进制数据)李>
<李>函数中的参数对象李>
<李>节点列表对象李>
可以看上面的原生数据结构中并没有对象(对象),为什么呢?
那是因为对象属性的遍历先后顺序是不确定的,需要开发者手动指定。本质上,遍历器是一种线性处理,对于任何非线性的数据结构,部署遍历器接口就等于部署一种线性变换。
做如下处理,可以使对象供……的消费:
//code1 函数Obj(价值){ 这一点。值=https://www.yisu.com/zixun/value; 这一点。下一个=零; } Obj.prototype(象征。迭代器]=function () { var迭代器={ 下: }; 当前var=; 函数next () { 如果(当前){ var值=current.value; 当前=current.next; 返回{ 完成:假的, 价值:价值 }; 其他}{ 返回{ 完成:真 }; } } 返回迭代器; } var>//code2 让设置=new()阀门阀门(a) (b)阀门(' c '); 让(x, y)=设置;//x=a;y=' b ' 让(首先,…休息]=设置;//第一次=' a ';休息=[' b ', ' c '); >之前(2)扩展运算符
//code3//例一 var str='你好'; […str]//[' h ', ' e ', ' l ', ' l ', ' o ']//例二 让arr=[' b ', ' c '); (' a ',……加勒比海盗,' d ')//(a, b, c, d的) >之前(3)发电机函数中的产量*表达式(下一章介绍)
//code4 让发电机=函数* (){ 收益率1; 产量* (2、3、4); 收益率5; }; var迭代器=发生器(); iterator.next()//{价值:1、完成:假} iterator.next()//{完成值:2日:假} iterator.next()//{值:3:假} iterator.next()//{完成值:4日:假} iterator.next()//{值:5,完成:假} iterator.next()//{值:未定义,完成:真正的} >之前(4)其它场合
<李> 李>的. . <李> Array.from李> <李> Map (), (), WeakMap (), WeakSet() 李> <李> Promise.all() 李> <李> Promise.race() 李>
<强> 3,……的循环的优势强>
先看看,数组forEach方法的缺点:
//code5 myArray。forEach(功能(价值){ console.log(价值); }); >之前这个写法的问题在于,无法中途跳出forEach循环,打破命令或返回命令都不能生效。
再看看,对象……在的循环的缺点:
(var指数myArray) { console.log (myArray(指数));};<李>数组的键名是数字,但是……在循环是以字符串作为键名,“0”,“1”,“2”等。李> <李>……在循环不仅可以遍历数字键名,还会遍历手动添加的期推荐,甚至包括原型链上的键。李> <李>某些情况下,…在循环会议任意顺序遍历键名李> <李>……在遍历主要是为遍历对象而设计的,不适用于遍历数组李
ES6迭代器(迭代器)和for.of循环使用方法学习(总结)