ES6的Iterator对象详解

Iterator实现原理

  1. 建立一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。数组

  2. 第一次调用指针对象的next方法,能够将指针指向数据结构的第一个成员。数据结构

  3. 第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。函数

  4. 不断调用指针对象的next方法,直到它指向数据结构的结束位置。指针

每一次调用next方法,都会返回数据结构的当前成员的信息。具体来讲,就是返回一个包含value和done两个属性的对象。其中,value属性是当前成员的值,done属性是一个布尔值,表示遍历是否结束。code

ES6 里的迭代器并非一种新的语法或者是新的内置对象(构造函数), 而是一种协议,全部遵循了这个协议的对象均可以称之为迭代器对象,因此说迭代器是一种协议,一个统一的接口标准,两个属性都不返回值也不会报错,可是不符合协议标准了,就不能称做迭代器了对象

如何部署Iterator接口

在ES6中,有三类数据结构原生具有Iterator接口:数组、某些相似数组的对象、Set和Map结构,对象(Object)之因此没有默认部署Iterator接口,是由于对象的哪一个属性先遍历,哪一个属性后遍历是不肯定的,须要开发者手动指定。接口

Iterator接口部署在对象的Symbol.Iterator属性上, 能够调用这个属性,就获得遍历器对象。开发

var arr = ['a', 'b', 'c'];
     var iterator = arr[Symbol.iterator]();
     var a = iterator.next();
     console.log(a)   //{value: 'a', done: false}

for--of与for--in

for...in 遍历每个属性名称,而 for...of遍历每个属性值。部署

在对象没有部署Iterator接口的状况下调用for...of会报错。当一个部署了Iterator接口的对象调用for...of时,
实现的步骤是这样的:it

  1. 调用对象的Symbol.Iterator的属性得到遍历器生成函数;

  2. 调用遍历器生成函数返回遍历器对象其实for...of就至关于一直调用遍历器对象的next方法,直到返回done为true;

相关文章
相关标签/搜索