2021.7.11 Iterator迭代器接口

Iterator迭代器接口

迭代器(Iterator)是一种机制(接口):为各种不同的数据结构提供统一的访问机制,任何数据结构只要部署Iterator接口,就可以完成遍历操作(for…of)循环,依次处理该数据结构的所有成员。

  • 底层机制:
    • 迭代器接口是定义在Symbol.iterator属性上的一个方法
    • 迭代器接口拥有一个next方法用于依次遍历数据结构的成员
    • 每一次遍历返回的结果是一个对象{ value: xxx, done: false }
      • done:记录是否完成遍历。未完成,值为false;完成,值为true
      • value:当前遍历的结果
    • 最后一次遍历结束后,返回的结果为{ value: undefined, done: true },并且以后再调用next方法返回的结果都是这个
  • 拥有Symbol.iterator属性的数据结构(值),被称为可被遍历的,可以基于for…of循环处理
    • 数组
    • 部分类数组:arguments/NodeList/HTMLCollection…
    • String
    • Set
    • Map
    • generator object
  • 对象默认不具备Symbol.iterator,属于不可被遍历的数据结构

自己实现Iterator类

class Iterator {
  constructor (assemble) {
  	let self = this;
  	self.assemble = assemble;
  	self.index = 0;
  }
  next() {
  	let self = this,
  		assemble = self.assemble;
  	if (self.index >= assemble.length - 1{
  	  return {
  	    value: undefined,
  	    done: true
  	  };
  	}
  	return {
  	  value: assemble[self.index++],
  	  done: false
  	}
  }
}
let itor = new Iterator([10, 20, 30, 40]);
console.log(itor.next()); //->{value:10,done:false}
console.log(itor.next()); //->{value:20,done:false}
console.log(itor.next()); //->{value:30,done:false}
console.log(itor.next()); //->{value:40,done:false}
console.log(itor.next()); //->{value:undefined,done:true}

让对象也具备迭代器接口

Object.prototype[Symbol.iterator] = function () {
  let assemble = this,
    keys = Object.keys(assemble).concat(Object.getOwnPropertySymbols(assemble)),
    index = 0;
  return {
    next() {
      if (index >= keys.length) {
        return {
          value: undefined,
          done: true
        }
      }
      return {
        value: assemble[keys[index++]],
        done: false
      }
    }
  }
}
let obj = {
  name: 'aaa',
  age: 12,
  teacher: 'team'
};
for (let value of obj) {
  console.log(value);
}

让类数组具有Iterator接口
可以采取方法借用的方式

let obj = {
    0: 10,
    1: 20,
    2: 30,
    length: 3
};
obj[Symbol.iterator] = Array.prototype[Symbol.iterator];
for (let item of obj) {
    console.log(item);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值