iterator接口的目的
Iterator 接口的目的,就是为所有数据结构,提供了一种统一的访问机制,即for…of循环(详见下文)。当使用for…of循环遍历某种数据结构时,该循环会自动去寻找 Iterator 接口。
一种数据结构只要部署了 Iterator 接口,我们就称这种数据结构是“可遍历的”(iterable)。
接下来展示我写的最简单的接口的使用方法
let arr = [1, 2, 3];
let iter = arr[Symbol.iterator]();
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
定义数组,然后通过第二行代码返回一个接口对象,我们就可以使用对象里面的next方法。
看了阮一峰老师的博客,我也知道了接口的实现方式。
function makeIterator(array) {
var nextIndex = 0; //闭包原理
return {
next: function() {
return nextIndex < array.length ?
{value: array[nextIndex++], done: false} :
{value: undefined, done: true};
}
};
}
给对象内部添加iterator接口
var obj = {
name: 'renjialei',
age: 18,
[Symbol.iterator]() {
let self = this
let i = 0;
let arr = Object.keys(this);
return {
next: function() {
if (arr.length > i) {
return {
value: self[arr[i++]],
done: false,
}
} else {
return {
value: undefined,
done: true
}
}
}
}
}
}
给具有length属性的数据结构添加接口,可以使用简便方法,客官请看代码
var obj = {
0: 'a',
1: 'b',
3: 'c',
length: 4,
[Symbol.iterator]: Array.prototype[Symbol.iterator]
}
for (let key of obj) {
console.log(key);
}
还有就是原生具有iterator接口的数据结构类型有:
Array
Map
Set
String
TypedArray
函数的 arguments 对象
NodeList 对象
接下来说一下for…in…和for…of…的区别
for…in…方法主要的是去遍历对象的方法,它的返回值是字符串形式。而for…of…主要是访问数组以及类数组这样的具有iterator接口的数据结构,返回值是对应的具体的值。