11.Iterator
Iterator遍历器
概念:iterator是一种接口机制,为各种不同的数据结构提供统一访问机制
作用:
1.为各种数据结构提供一个统一的、简便的访问接口
2.使得数据结构的成员能够按照某种次序排列
3.es6创造了一种新的遍历命令for…of 循环,Iterator接口主要供for …of 消费
工作原理:
创建一个指针对象(遍历器对象),指向数据结构的起始位置
第一次使用next方法,指针自动指向数结构的第一个成员
接下来不断调用next方法,指针就会一直向后移动,直到指针指向最后一个成员
每调用next方法返回的是一个包含value和done的对象,{value:当前成员的值,done:布尔值}
value表示当前成员的值,done对应的布尔值表示当前的数据的结构是否遍历结束
当遍历结束的时候返回value的值是undefined,done值为true
原生具备iterator接口的数据(可用for of 遍历)
扩展理解:
1,当数据结构上部署了Symbol.iterator接口,该数据就是可以用 for of调用
2.当使用for of 去遍历目标数据的时候,该数据会自动去找Symbol.iterator属性
//Symbol.iterator属性指向对象的默认遍历器方法。
1.Array
2.arguments
3.set容器
4.map容器
5.String
<script type="text/javascript">
//模拟指针对象(遍历器对象)
function myIterator(arr){ //iterator接口
let nextIndex = 0;//记录指针位置
return{ //遍历器对象
next:function(){
return nextIndex < arr.length ?{value:arr[nextIndex++],done:false} : {value:undefined,done:true}
}
}
}
//准备一个数据
let arr =[1,98,"hhh"]
let iteratorObj = myIterator(arr)
console.log(iteratorObj.next()) //{value: 1,done:false}
console.log(iteratorObj.next()) //{value: 98,done:false}
console.log(iteratorObj.next()) //{value: hhh,done:false}
console.log(iteratorObj.next()) //{value: undefined,done:true}
//将iterator接口部署到指定的数据类型上,可以使用for of 遍历
//数组,字符串,arguments,set容器,map容器
for(let i of arr){
console.log(i)
}//输出 1 98 hhh
let str="abcd"
for(let i of str){
console.log(i)
}//输出a b c d
function foo(){
for(let i of arguments){ //arguments伪数组,没有一般数组的方法
console.log(i)
}
}
foo(7,"ab") //输出 7 ab
//object没有iterator. Symbol.iterator属性指向对象的默认遍历器方法。
let obj = {name: "tom", age: 12}
//等同于在指定的数据内结构上部署了iterator接口
//当使用for of 去遍历某个数据结构的时候,首先去找Symbol.iterator 找到就去遍历,没有找到就不能遍历xxx is not iterable
let targetData ={
[Symbol.iterator]:function(){
let nextIndex = 0;
return{ //遍历器对象
next:function(){
return nextIndex < this.length ?{value:this[nextIndex++],done:false} : {value:undefined,done:true}
}
}
}
}
//使用三点运算符,解构赋值,默认去调用iterator接口