迭代器 /遍历器 Iterator
-
迭代器是什么
迭代器Iterator是一个具有next方法的对象 (generator对象)。 -
为什么要使用Iterator 迭代器?
javaScript 有两种集合类型的数据结构 Array、Object。es6新增了set / map 两种集合类型的数据结构。迭代器Iterator的出现是为了能够有一个统一遍历接口机制,来处理不同的数据结构类型的遍历(依次对内部成员进行操作)。 -
数据结构的Symbol.Iterator
具体表现在各数据结构的Symbol.Iterator属性上,Symbol.iterator属性的值是一个函数,它返回一个迭代器对象。一个数据结构只要部署了Symbol.iterator属性就能使用 for...of遍历 与 ...运算符 操作(object 因为没有部署这个属性,所以不能直接使用 for of 和 展开运算符) -
以下几个数据类型默认部署了Symbol.Iterator属性(可使用 for of 、展开运算符)
- 数组
- 字符串
- Map
- Set
- Arguments对象
- NodeList
具体实现
let obj = {
[Symbol.iterator] () {
let val = 0
return {
next () {
if (val > 5) {
return {done: true}
}
return {value: val++,done: false}
}
}
}
}
for (let val of obj) {console.log(val)}
let iterator = obj[Symbol.iterator]
iterator.next()
iterator.next()
iterator.next()
iterator.next()
iterator.next()
iterator.next()
补充 for in/ for of/forEach
- for in 的出现 是为了解决对象遍历的问题,他会遍历出所有可枚举类型的属性
- forEach 的出现是为了给解决for 遍历数组过于麻烦的问题。缺点就是不能在遍历过程中跳出。
- for of 是专门供给 Iterator迭代器消费的。
数组的entries方法
数组的entries方法返回的是一个数组键值对的迭代器;如下:
let arr = ["李明","韩寒","lhy","spx"]
let it = arr.entries();
console.log(it.next())
网友评论