Iterator与for...of循环

      在前面的文章中介绍了ES6中提供的新数据结构Set(https://blog.csdn.net/qq_26834399/article/details/79568588)和Map(https://blog.csdn.net/qq_26834399/article/details/105071907),这两种数据结构都表示了集合的概念,但与Array不同,不能使用传统的forEach去遍历,于是ES6提供了一个统一的遍历接口Iterator。

      Iterator可以为不同的数据结构提供统一的访问机制,即for...of循环。一个数据结构,只要具有Symbol.iterator属性,就认为是可遍历的,就可以使用Iterator接口。原生具有Symbol.iterator属性的数据结构有Array,String,Map,Set,函数的arguments对象等。Object没有原生的可遍历属性,但可以给它设置Symbol.iterator函数。

const iteratorObj = {
  data:['Annie','Keith','Eddie'],
  [Symbol.iterator] : function () {
    var that = this;
    var idx = 0;
    return {
      next: function () {
        var data = that.data;
        if(idx<data.length){
          return{
            value:data[idx++],
            done:false
          }
        }else{
          return {
            value: undefined,
            done: true
          };
        }
      }
    };
  }
};

      有了遍历器接口,数据结构就可以使用for...of循环遍历了,for...of内部调用的就是数据结构的Symbol.iterator方法。下面来举几个例子。

      1、数组中for...of的应用

      数组中for...of与for...in的区别是,for...in只能获得对象的键名(包括索引和其他额外设置的属性key)且在某些情况下,会以任意顺序返回键名;for...of可以直接获得键值(只返回具有数字索引的属性)

const arr = ['Annie','Keith','Eddie'];
arr.family = 603;
for(item of arr){
    console.log(item);
}
//Annie 
//Keith 
//Eddie 

for(item in arr){
    console.log(item);
}
//0 
//1 
//2 
//family

      2、Set中for...of的应用 

const set = new Set(['Annie','Keith','Eddie']);
for(item of set){
    console.log(item);
}
//Annie 
//Keith 
//Eddie 

      3、Map中for...of的应用

      Map结构遍历时,返回的是一个length为2的数组,两个成员分别是当前成员的键名和键值

let map = new Map().set('name', 'Annie').set('age', 18);
for (let item of map) {
  console.log(item);
}
// ['name', 'Annie']
// ['age', 18]

for (let [key, value] of map) {
  console.log(key + ':' + value);
}
// name:'Annie'
// age:18

      4、部署了Iterator接口的对象

      以前面设置过Symbol.iterator的对象为例,遍历结构如下

for(item of iteratorObj){
    console.log(item)
}

//Annie 
//Keith 
//Eddie 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值