iterator 和 for of
iterator遍历器
function myiterator(arr){
let index = 0
return {
next: function(){
return index<arr.length?{value:arr[index++],done:'false'}:{value:undefined,done:true}
}
}
}
let arr = [1,2,a,b,6]
let my = myiterator(arr)
console.log(my.next())
console.log(my.next())
iterator 是一个模拟指针对象(遍历器对象),其中包含一个next方法,return 返回一个包含value和done的对象,如上函数
value 的值为arr内的值,(如下图)第一次调用next()方法,指向数据结构的第一个, 调用一次 next() 就会向下走一次,以此类推,到最后一位再次调用next()时,就会变undefined,
done 的值为布尔值,默认为false,如下图) 第一次调用next()方法,指向数据结构的第一个, 调用一次 next() 就会向下走一次,以此类推,指到最后一位再次调用next()时,就会变true
上面 let index=0 相当于计数器,
return时的判断就是如果计数器数值不小于数组的长度,就说明走到尽头了,
直接返回 {value:undefined,done:true}
默认在起始位置,每调用一次 next( ) 指针就会向下执行,直到指向最后一位时,继续调用 next() 则会返回的 { value: undefined, done: true }
部署iterator接口
Iterator接口部署在数据结构的Symbol.iterator属性,Symbol.iterator属性本身也是函数。执行这个函数,就会返回一个遍历器。
将iterator接口部署到指定的数据类型上,可以使用for of 去遍历循环
let targetData= {
[Symbol.iterator]: function(){
let index = 0
return {
next: function(){
return index<this.length?{value:this[index++],done:''}:{value:undefined,done:true}
}
}
}
}
for of 循环
当使用for of 去遍历某一个数据结构的时候,找到Iterator接口就遍历,找不报错
如下具备Iterator接口:
-
Array
-
Map
-
Set
-
String
-
TypedArray
-
函数的argument对象
let arr1 = '1ad3'
for(let i of arr1){
console.log(i)// -> 1, a, d, 3
}
let arr = [1,2,'a1','b',5,6]
for(let i of arr){
console.log(i) //->1,2,a1,b,5,6
}