ES6中的迭代器iterator
什么是迭代器?
统一的遍历数据的方式。
首先获取到迭代器的指针,初始时这个指针指向的是第一条数据之前。通过调用指针的next()方法,使指针指向下一条数据。每一个next()都会返回一个对象,其中包含两个属性,value表示想要获取的值,done是个布尔值,false表示当前指针指向有值,true表示当前遍历结束。
支持迭代器的数据类型?
Array、Map、Set、String、TypedArray、函数的arguments对象、Nodelists对象
Array数据获取迭代器的方法
entries()
通过调用entries()方法返回一个迭代器,此迭代器的next()方法每次返回的数据--{value : {索引:值}, done : false/true}
values()
通过调用values()方法返回一个迭代器,此迭代器的next()方法每次返回的数据--{{value : 值, done : false/true}}
keys()
通过调用keys()方法返回一个迭代器,此迭代器的next()方法每次返回的数据--{{value : 索引, done : false/true}}
[Symbol.iterator]()
可迭代对象中默认包含一个Symbol.iterator属性,是一个函数。通过调用[Symbol.iterator]()方法返回一个迭代器,此迭代器的next()方法每次返回的数据--{{value : 值, done : false/true}}
如何为自定义对象添加迭代器?
var obj = { name:'ashen', age:21, [Symbol.iterator]:function(){ let i = 0; let keys = Object.keys(this); // 获取当前对象的所有属性并形成一个数组 return { next: function(){ return { value:keys[i++], // 外部每次执行next都能得到数组中的第i个元素 done:i > keys.length // 如果数组的数据已经遍历完则返回true } } } }
}
迭代器的应用场景
- 解构赋值
- 扩展运算符
- for..of..循环
- 。。。