迭代器(Iterator)是一种机制(接口):为各种不同的数据结构提供统一的访问机制,任何数据结构只要部署Iterator接口,就可以完成遍历操作[for of 循环] 1.拥有next方法用于依次遍历数据结构的成员 2.每次遍历返回的结果是一个对象{done:false,value:xxx} done:记录遍历是否完成 value:当前遍历的结果
必须暴露一个属性作为“默认迭代器”,而且这个属性必须使用特殊的 Symbol.iterator 作为键。这个默认迭代器属性必须引用一个迭代器工厂函数,调用这个工厂函数必须返回一个新迭代器。 很多内置类型都实现了 Iterable 接口: 字符串 数组 映射 集合 arguments 对象 NodeList 等 DOM 集合类型
arr=[1,2,3]
console.log(arr[Symbol.iterator])
console.log(arr[Symbol.iterator]())
for (const i of arr) {
console.log(i)
}
验证for of的时候,首先会调用数据结构的[Symbol.iterator]函数
arr=[1,2,3]
arr[Symbol.iterator]=function iterator(){
console.log('OK')
}
for (let i of arr) {
console.log(i)
}
报错是因为还不规范 对象默认不具备Symbol.iterator,属于不可遍历的数据结构
let obj={
name:'xxx',
age:12,
sex:'男'
}
for (let i of obj) {
console.log(i)
}
数组重写Symbol.iterator方法
let arr=[10,20,30,40]
arr[Symbol.iterator]=function iterator(){
let index=0,
self=this
return {
next(){
if(index>self.length-1) {
return {
done:true,
value: undefined
};
}
return {
done:false,
value: self[index++]*100
};
}
}
}
for (let i of arr) {
console.log(i)
}
for of循环也可以对对象进行迭代
let obj={
name:'xxx',
age:12,
sex:'男'
}
obj[Symbol.iterator]=function iterator(){
self=this,keys=Reflect.ownKeys(self),index=0
return {
next(){
if(index>keys.length-1) {
return {
done:true,
value: undefined
};
}
return {
done:false,
value: self[keys[index++]]
};
}
}
}
for (let i of obj) {
console.log(i)
}
|