Iterator迭代器

iterator迭代器

需要自定义遍历数据的时候,用到迭代器

主要供 for...of 消费

任何数据结构只要部署了 iterator 接口,就可以用 for...of 进行遍历操作。
iterator 实际上是对象中的一个属性(方法),名: Symbol.iterator


自带iterator的数据
原生具备 iterator 接口的数据(可用for...of遍历)

  • Array
  • Arguments
  • Set
  • Map
  • String
  • TypedArray
  • NodeList
补充知识
例:for(let i of/in 数组/对象){}
/*
for of 遍历数组 i为数组中的元素
for of 遍历对象 报错
for in 遍历数组 i为索引值
for in 遍历对象 i为键名
*/

工作原理

  1. 创建一个只针对象,指向当前数据结构的起始位置
  2. 第一次调用对象的next方法,指针自动指向数据结构的第一个成员
  3. 不断调用next方法,指针一直后移,直到指向最后一个成员
  4. next方法返回一个包含value和done属性的对象

如果想要for...of能遍历所有对象

// 给Object的原型对象prototype添加方法,方法名:Symbol.iterator
Object.prototype[Symbol.iterator] = function(){
  let index = 0 //索引变量
  let _this = this //保存当前this
  let arr = Object.keys(this) //获取对象中所有属性名
  return{ //指针对象
    next:function(){
      if(index < arr.length){
        const result = {
          value:_this[arr[index]], // _this[arr[index]]属性值,arr[index]属性名
          done:false
        }
      }else{
        return {value: undefined, done: true}
      }
    }
  }
}

// ok现在就可以用for..of遍历对象了
let obj = {
  name:'小明',
  age:19,
  sex:'男'
}

for(let i of obj){
  console.log(i)
}

/*
  结果:
    小明
    19
    男
*/
posted @ 2022-07-15 13:40  ycccc丶  阅读(15)  评论(0编辑  收藏  举报
//背景线条