JavaScript杂谈之iterator for循环

来源:互联网 发布:阿里云国际版注册 编辑:程序博客网 时间:2024/05/17 03:00

iterator


为了给表示集合的数据结构如数组、对象、set、map等定义一个统一的接口,方便进行统一的遍历,ES6新增了一种遍历器机制即iterator。其作用有三个,提供统一便利的访问接口,是数据结构成员按照一定次序排列,供for of使用遍历。调用遍历器后其会返回一个含有value和done两个属性的对象,value代表当前成员值,done为布尔值代表当前是否完成遍历,同时对象还存在一个next方法遍历下一个有效值,return方法如果遍历中途退出就会调用return,用于清理或释放资源,throw方法主要配合Generator函数使用,下面给出一个简单实现。
let makeIterator = function(){    let index = 0;    return {        next(){            return index < array.length ?                {value: array[++index]}:                {done: true}        }    }}
同时,ES6提供了三类数据结构的iterator的原生接口,数组、某些类似数组对象、set和map,不过类数组对象中并没有直接存在[Symbol.iterator]方法(至少nodelist没有,string有),这是一个函数,运行后可以生成iterator遍历器,在我们可以简单地将

Nodelist[Symbol.iterator] = new Set()[Symbol.iterator]

当然,iterator接口除了for of的使用场景之外,另外还有几种,我们简单介绍一下:1.在进行数组和set的解构赋值时会调用iterator方法2.扩展运算符会调用iterator3.yield*如果后面跟一个可遍历数据结构,则调用iterator4.由于数组的遍历会用到遍历器接口,所以任何接受数组作为参数的地方都使用了遍历器

for of

与for in循环形式类似,不过for in是活的对象键名,而for of直接调用iterator接口活的键值,应用范围也是可以拥有iterator接口的数据结构,这里可能会用到转化为数组的方法[Array.from](可以参考我之前的文章)entries()返回一个遍历器对象,用于遍历[键名,键值]组成的数组.keys()返回一个遍历器对象,用于遍历键名.values()一个遍历器对象,用于遍历键值.最后看一下js所有的遍历语法所以js又提供了foreach循环方法,但是foreach循环无法中途退出循环。所以for of应运而生,且配合iterator统一接口更加封装性进行遍历。
0 0
原创粉丝点击