iterator接口
- 默认的 Iterator 接口部署在数据结构的Symbol.iterator属性,或者说,一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”
const arr = ['a','b','c']
const iter = arr[Symbol.iterator]()
iter.next()
console.log(iter.next()) // {value:'b',done:false}
-
原生具备iterator接口的数据结构:
- Array
- Set
- Map
- String
- TypedArray (类数组)
- arguments对象
- NodeList对象 (节点)
-
类数组对象调用数组的Symbol.iterator方法
let iterable = {
0: 'a',
1: 'b',
2: 'c',
length: 3,
[Symbol.iterator]: Array.prototype[Symbol.iterator]
};
// length [Symbol.iterator] 缺一不可
for (let item of iterable) {
console.log(item); // 'a', 'b', 'c'
}
// 普通对象部署数组的Symbol.iterator方法,并无效果
let iterable = {
a: 'a',
b: 'b',
c: 'c',
length: 3,
[Symbol.iterator]: Array.prototype[Symbol.iterator]
};
for (let item of iterable) {
console.log(item); // undefined, undefined, undefined
}
- 对象添加iterator接口
let obj = {
name: 'XX',
age: 12,
sex: '男',
[Symbol.iterator]() {
const that = this;
const keys = Object.keys(that);
let index = 0;
return {
next() {
if (index < keys.length) {
return {
value: that[keys[index++]],
done: false,
};
}
return {
value: undefined,
done: true,
};
},
};
},
};
for (let item of obj) {
console.log(item); //XX 12 男
}
Array.prototype.entries
返回一个新的Array Iterator对象,该对象包含数组中每个索引的键值对
const array1 = ['a', 'b', 'c'];
const iterator1 = array1.entries();
console.log(iterator1) // 遍历器对象
iterator1.next() // {value:[0,'a'],done:false}
iterator1.next() // {value:[1,'b'],done:false}
Object.entries(obj)
const obj = {name:'zhang',age:12}
console.log(Object.entries(obj)) //[['name','zhang'],['age','12']]