JS的 for of 是否可以迭代普通的对象?答: 不可以,因为不具备Symbol.iterator迭代器接口规范

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

  • 拥有next方法用于依次遍历数据结构的成员
  • 每一次遍历返回的结果是一个对象 {done:false,value:xxx}
  • done:记录是否遍历完成
  • value:当前遍历的结果
拥有Symbol.iterator属性的数据结构(),被称为可被遍历的,可以基于for of循环处理
对象默认不具备Symbol.iterator,属于不可被遍历的数据结构
如果想让它可以迭代普通对象,我们应该咋做?答:手动给对象的原型上加一个Symbol.iterator迭代器接口

Object.prototype[Symbol.iterator] = function values() {
 备注: Object.getOwnPropertySymbols() 能获取到symbol属性
  let assemble = this,
      keys = Object.keys(assemble).concat(Object.getOwnPropertySymbols(assemble)),
      index = 0;
  return {
      next() {
          if (index > keys.length - 1) {
              return {
                  done: true,
                  value: undefined
              };
          }
          let key = keys[index++];
          return {
              done: false,
              value: assemble[key]
          };
      }
  };
};
let obj = {
  name: 'test',
  age: 18,
  0: 100,
  1: 200
};
for (let value of obj) {
  console.log('value', value);
}
value结果: 100,100,'test',18

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值