基本概念:
- 在ES6中新增了Set和Map两种数据结构,再加上js之前原有的数组和对象,这样就有了四种数据集合,平时还可以组合使用他们,定义自己到的数据结构,比如数组的成员是Map,Map的成员是对象等。这样就需要一种统一的接口机制,来处理所有不同的数据结构
- Iterator 就是这样一种极致。他是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口,就可以完成遍历操作,二期二这种遍历操作是依次出里改数据结构的所有成员
- Iterator 遍历器的作用:
- 为各种数据结构,提供一个统一的,简便的访问接口
- 似的数据结构的成员能够按某种次序排列
- ES6新增了遍历命令for 。。。 of循环,Interator 接口主要供for…of消费
1、书写Iterator接口:
const arr = [1, 2, 3];
function interator(arr) {
let index = 0;
return {
next(){
return index < arr.length ? {value:arr[index++],done:false} : {value:undefined,done:true}
}
}
}
const it = interator(arr);
console.log(it.next())//{ value: 1, done: false}
console.log(it.next())//{ value: 2, done: false}
console.log(it.next())//{ value: 3, done: false}
console.log(it.next())//{ value: undefined, done: false}
Iterator的遍历过程:
- 创建一个指针对象,指向当前数据结构的起始位置,也就是谁,遍历器对象本质上就是一个指针对象。
- 第一次调用指针对象的next方法,可以将指针指向是数据结构的第一个成员
- 第二次调用真真对象的next方法,指针就指向数据结构的第二个成员
- 不断调用指针对象的next方法,直到它指向数据结构的结束位置。
- 每一次调用next方法,都会返回数据结构的当前成员的信息,具体来说,就是返回一个包含value 和 done两个属性的对象,其中,value属性是当前成员的值,done属性是一个布尔值,表示遍历是否结束
2、凡是具有Symbol.iterator 属性的数据结构都具有Iterator接口
const arr = [1,2,3];
const set = new Set(arr);
const map = new Map([
["a",1]
]);
const itArr = arr[Symbol.iterator]();
const itSet = set[Symbol.iterator]();
const itMap = map[Symbol.iterator]();
console.log(itArr); //Object [Array Iterator] {}
console.log(itSet); // [Set Iterator] { 1, 2, 3 }
console.log(itMap); // [Map Entries] { [ 'a', 1 ] }
console.log(itSet.next()); // { value: 1, done: false }
console.log(itSet.next()); // { value: 2, done: false }
console.log(itSet.next()); // { value: 3, done: false }
console.log(itSet.next()); // { value: undefined, done: true }
const obj = {};
console.log(obj[Symbol.Iterator]); // undefined
3、距被Iterator接口的数据结构都可以进行如下操作:
- 解构赋值
- 使用for。。。of
- 扩展运算符