Iterator接口

iterator接口

  • 默认的 Iterator 接口部署在数据结构的Symbol.iterator属性,或者说,一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”
const arr = ['a','b','c']
const iter = arr[Symbol.iterator]()
iter.next()
console.log(iter.next()) // {value:'b',done:false}
  • 原生具备iterator接口的数据结构:

    • Array
    • Set
    • Map
    • String
    • TypedArray (类数组)
    • arguments对象
    • NodeList对象 (节点)
  • 类数组对象调用数组的Symbol.iterator方法

let iterable = {
  0: 'a',
  1: 'b',
  2: 'c',
  length: 3,  
  [Symbol.iterator]: Array.prototype[Symbol.iterator]
};
// length  [Symbol.iterator] 缺一不可

for (let item of iterable) {
  console.log(item); // 'a', 'b', 'c'
}

// 普通对象部署数组的Symbol.iterator方法,并无效果
let iterable = {
  a: 'a',
  b: 'b',
  c: 'c',
  length: 3,
  [Symbol.iterator]: Array.prototype[Symbol.iterator]
};
for (let item of iterable) {
  console.log(item); // undefined, undefined, undefined
}
  • 对象添加iterator接口
let obj = {
  name: 'XX',
  age: 12,
  sex: '男',
  [Symbol.iterator]() {
    const that = this;
    const keys = Object.keys(that);
    let index = 0;
    return {
      next() {
        if (index < keys.length) {
          return {
            value: that[keys[index++]],
            done: false,
          };
        }
        return {
          value: undefined,
          done: true,
        };
      },
    };
  },
};

for (let item of obj) {
  console.log(item); //XX  12  男
}

Array.prototype.entries

返回一个新的Array Iterator对象,该对象包含数组中每个索引的键值对

const array1 = ['a', 'b', 'c'];
const iterator1 = array1.entries();
console.log(iterator1)  // 遍历器对象
iterator1.next()  // {value:[0,'a'],done:false}
iterator1.next()  // {value:[1,'b'],done:false}

Object.entries(obj)

const obj = {name:'zhang',age:12}
console.log(Object.entries(obj)) //[['name','zhang'],['age','12']]
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值