一、概念:Iterator(遍历器)为不同的数据类型提供统一的访问机制,只要部署了 Iterator 接口(原型上有 Symbol.iterator 方法),就可以完成遍历操作,遍历操作主要通过 for of 完成。
let arr = [1,2,3];
//使用for of 完成遍历
for(var i of arr){
console.log(i);//1 2 3
}
二、具备Iterator 接口的数据类型:原生具备 Iterator 接口的数据结构主要有 Array、Set 、Map、String 、NodeList、函数的arguments对象、TypedArray,这类数据结构的原型上都有 Symbol.iterator 方法。
let arr = [1,2,3];
console.log(arr)//打印出来的部分截图如下
let arr = ['a', 'b'];
let iter = arr[Symbol.iterator]();
iter.next() // { value: 'a', done: false }
iter.next() // { value: 'b', done: false }
iter.next() // { value: undefined, done: true }
三、不具备 Iterator 接口的数据类型:对象不具备 Iterator 接口,在 ES6 中可以使用 Map 数据结构。如果要在 ES5 中可以被 for of 遍历,就必须在 Symbol.iterator 的属性上部署遍历器生成方法。
function Person(name) {
this.name = name;
this.next = null;
};
Person.prototype = {
[Symbol.iterator]() {
let self = this;
return {
next:function next(){
if (self) {
var val = self.name;
self = self.next;
return {
value: val,
done: false
};
} else {
return { value: undefined, done: true };
}
}
};
}
}
var one = new Person('张三');
var two = new Person('李四');
var three = new Person('王五');
one.next = two;
two.next = three;
for(var i of one){
console.log(i)//张三 李四 王五
}