概念
遍历器(Iterator)是一种接口,为各种不同的数据结构提供统一的访问机制。
任何数据结构只要部署Iterator接口,就可以完成遍历操作。
遍历过程:
(1)创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。
(2)第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。
(3)第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。
(4)不断调用指针对象的next方法,直到它指向数据结构的结束位置。
使用
1)原生具备Iterator接口的数据结构
数组、类数组对象、Set和Map结构
这些数据结构,不用做任何处理,就可以被for…of循环遍历。
使用方法
1) 实例化对象 调用[Symbol.iterator]()接口
2)实例化对象拥有了next方法
3)不断调用next方法,获取下一位成员
或
2)使用for of遍历成员
返回值
对象,包含value值,以及一个done属性。
成员还没有遍历完,done就会返回false。
实例
let arr = ['hello','world'];
//创建实例对象,调用[Symbol.iterator]()接口
let map = arr[Symbol.iterator]();
//不断调用next方法,获取下一位成员
console.log(map.next());
console.log(map.next());
console.log(map.next());
//或者使用for of遍历
let arr = ['hello','world'];
for(let key of arr){
console.log(key); //hello world
}
没有原生Iterator接口的
使用方法
1)创建Symbol.iterator接口
[Symbol.iterator](){ 逻辑代码 返回一个对象}
这个对象有next()方法。
next方法(自定义返回值)
2)使用 for of遍历
实例
依次遍历start、end里的数
let obj = {
start:[1,3,2],
end:[7,9,8],
//注意这里
//创建接口,建立逻辑
[Symbol.iterator](){
let self = this;
let index = 0;
//使用了数组的concat方法,拼接一个新数组
let arr = self.start.concat(self.end);
let len = arr.length;
//返回一个对象
return {
//使用next()方法
next(){
if(index<len){
return {
value: arr[index++],
done: false
}
}
else{
return{
value: arr[index++],
done: true
}
}
}
}
}
}
//使用for of循环遍历成员
for(let key of obj){
console.log(key); // 1 3 2 7 9 8
}
文章撰写时参考了以下资料,内容版权归原作者所有,仅作参考引用之途。