Iterator 是一种接口机制,为各种不同的诗句结构提供统一的访问机制 主要供 for of 消费 一句话,不支持遍历的数据结构 可便利
function makeIterator(arr){
let nextIndex = 0
return {
next(){
return nextIndex < arr.length ? {
value: arr[NextIndex],
done:false
}:{
value: undefined,
done:true
}
}
}
}
let it = makeIterator(['a', 'b', 'c'])
console.log(it.next()) // a
console.log(it.next()) // b
console.log(it.next()) // c
console.log(it.next()) // undefined
创建一个指针,指针初始位置,第一次就指向第一个成员,第二次指向第二个成员,以此类推
let courses = {
allCourse: {
frontend: ['ES','Vue','React'],
backend:['JAVA','Python'],
webapp:['android','IOS']
}
}
// for(let c of courses){
// console.log(c) // 报错
// }
原生具备Iterator 接口的数据结构
- Array
- Map
- Set
- String
- TypedArray
- 函数的arguments对象
- NodeList 对象
let map = new Map()
map.set('name', 'es')
map.set('age', 5)
console.log(map)
let it = map[Symbol.iterator]()
console.log(it.next())
console.log(it.next())
console.log(it.next())
可迭代协议:必须包含 Symbol.iterator 迭代器协议:必须符合条件,必须返回一个对象 对象内必须包含next 返回一个对象内在返回一个 value 跟 done return{ next() {return {value,done } } }
let courses = {
allCourse: {
frontend: ['ES','Vue','React'],
backend:['JAVA','Python'],
webapp:['android','IOS']
}
}
courses[Symbol.iterator] = function(){
let allCourse = this.allCourse
let keys = Reflect.ownkeys(allCourse)
let values = []
return {
next(){
if(!values.length){
if(keys.length){
values = allCourse[keys[0]]
keys.shift()
}
}
return {
done: !values.length,
value: values.shift()
}
}
}
}
for(let c of courses){
console.log(c)
}