遍历器Iterator
遍历器(Iterator)它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口,就可以完成遍历操作
Iterator 的作用有三个:
- 为各种数据结构,提供一个统一的、简便的访问接口;
- 使得数据结构的成员能够按某种次序排列;
- ES6 创造了一种新的遍历命令for...of循环,Iterator 接口主要供for...of消费
Iterator的实现过程
创建一个指针对象,指向当前数据结构的起始位置,每一次调用next方法,都会返回数据结构的当前成员的信息。具体返回一个包含value和done两个属性的对象。其中,value属性是当前成员的值,done属性是一个布尔值,表示遍历是否结束。如果done是false表示未遍历完。
var arr = [1,3,5,7,9];
var iter = arr[Symbol.iterator]();
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());`
ES6可迭代数据类型
ES6 规定默认的 Iterator 接口部署在数据结构的Symbol.iterator属性(一个只要具有Symbol.iterator属性的对象,就可认为是“可遍历的”。原生具备 Iterator 接口的数据结构有:Array、Map、Set、String、TypedArray、 函数的arguments对象、NodeList 对象 类数组的迭代器(Iterator)接口设置方式
对于类似数组的对象(存在数值键名和length属性),部署 Iterator 接口,有一个简便方法,就是Symbol.iterator方法直接引用数组的 Iterator 接口
var obj2 = { // 类数组对象,属性名为有序的number
0:1,
1:2,
length:2,
[Symbol.iterator]:Array.prototype[Symbol.iterator]
};
for (let i of obj2){
console.log(i);
};
for...of
具有迭代器接口的数据都可以使用for...of遍历,迭代器方法部署在Symbol.iterator属性上
for...of能遍历所有的 “有序” 数据结构,因为object是无序的对象,所以不能使用这个方法遍历。