es6中的Iterator

Iterator遍历器,它是一种接口,为各种不同的数据提供统一的访问机制,任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。
迭代器是一种特殊对象,它具有一些专门为迭代过程设计的专有接口,所有的迭代器对象都有一个next()方法,每次调用都返回一个结果对象。结果对象有两个属性:一个是value,表示下一个将要返回的值;另一个是done,它是一个布尔类型的值,当没有更多可返回数据时返回true。迭代器还会保存一个内部指针,用来指向当前集合中值的位置,每调用一次next()方法,都会返回下一个可用的值
  如果在最后一个值返回后再调用next()方法,那么返回的对象中属性done的值为true,属性value则包含迭代器最终返回的值,这个返回值不是数据集的一部分,它与函数的返回值类似,是函数调用过程中最后一次给调用者传递信息的方法,如果没有相关数据则返回undefined。
在ES6中,有些数据结构原生具备Iterator接口(比如数组),即不用任何处理,就可以被for...of循环遍历,有些就不行(比如对象)。原因在于,这些数据结构原生部署了Symbol.iterator属性(详见下文),另外一些数据结构没有。凡是部署了Symbol.iterator属性的数据结构,就称为部署了遍历器接口。调用这个接口,就会返回一个遍历器对象。
在ES6中,有三类数据结构原生具备Iterator接口:数组、某些类似数组的对象、Set和Map结构。

作用:
1.为各种数据结构,提供一个统一的、简便的访问接口
2.使得数据结构的成员能够按某种次序排列
3.ES6创造了一种新的遍历命令for...of循环,Iterator接口主要供for...of消费。

Iterator的遍历过程:
(1)创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。
(2)第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。
(3)第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。
(4)不断调用指针对象的next方法,直到它指向数据结构的结束位置。

一个为对象添加Iterator接口的例子。

let obj = {
    start:[1,3,5,7],
    end:[2,4,6,8],
    [Symbol.iterator](){
      let self = this;
      let index = 0;
      let arr = self.start.concat(self.end);
      let len = arr.length;
      return {
        next(){
          if (index<len){
            return{
              value:arr[index++],
              done:false
            }
          }else{
            return{
              value:arr[index++],
              done:true
            }
          }
        }
      }
    }

  };
  for (let key of obj){
    console.log(key)
  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 五花肉の日记的第二十四篇日记,坚持第二十四天。 2018.4.16 晴 今日任务,装门,砸墙。 改水电啊,全是灰全...
    你的五花肉阅读 1,144评论 0 1
  • 昨天晚上放学回家,我正在厨房做饭,璐璐进来跟我聊起学校的事情; 璐:今天老师叫我们诗歌,我们班的江小希在堂上写了一...
    杜友珍Jenny_du阅读 2,649评论 0 0
  • 主旨: the product life cycle model of trade.Different types...
    b07c0ccac007阅读 2,481评论 4 1
  • 今天,说个什么故事好呢?嗯!有了,那,开始了: 世间有很多种爱情吧,不仅仅只是荷尔蒙与多巴胺在作祟,那,就推给缘分...
    邻家安心阅读 2,555评论 5 4

友情链接更多精彩内容