3-5 Iterator 迭代器

47 阅读1分钟

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)
}