Skip to content

Latest commit

 

History

History
44 lines (33 loc) · 1.74 KB

12.Iterator(迭代器).md

File metadata and controls

44 lines (33 loc) · 1.74 KB

Iterator(迭代器/遍历器)

es6新增了Set和Map,他们跟Array、Object类型很像,Array、Object都是可以遍历的,但是Set、Map都不能用for循环遍历。es6通过Iterator实现一个统一的遍历标准。

ES6给Set、Map、Array、String都加上了[Symbol.iterator]方法,默认可以遍历

let arr = ['a', 'b'];
let iter = arr[Symbol.iterator]();

iter.next() // { value: 'a', done: false }
iter.next() // { value: 'b', done: false }
iter.next() // { value: undefined, done: true }

Iterator 的遍历过程:

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

(2)第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。

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

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

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

  // 模拟
  var it = makeIterator(['a', 'b']);

  it.next() // { value: "a", done: false }
  it.next() // { value: "b", done: false }
  it.next() // { value: undefined, done: true }

  function makeIterator(array) {
    var nextIndex = 0;
    return {
      next: function() {
        return nextIndex < array.length ?
          {value: array[nextIndex++], done: false} :
          {value: undefined, done: true};
      }
    };
  }