1. 程式人生 > >Iterator 遍歷器

Iterator 遍歷器

ray 命令 ext 字符串 toolbar 分享圖片 生成函數 itl map

1、遍歷器(Iterator)是一種接口,為各種不同的數據結構提供統一的訪問機制。任何數據結構只要部署Iterator接口,就可以完成遍歷操作(即依次處理該數據結構的所有成員)。

2、Iterator的作用有三個:一是為各種數據結構,提供一個統一的、簡便的訪問接口;二是使得數據結構的成員能夠按某種次序排列;三是ES6創造了一種新的遍歷命令for...of循環,Iterator接口主要供for...of消費。

3、在ES6中,有些數據結構原生具備Iterator接口(比如數組),即不用任何處理,就可以被for...of循環遍歷,有些就不行(比如對象)。原因在於,這些數據結構原生部署了Symbol.iterator

屬性(詳見下文),另外一些數據結構沒有。凡是部署了Symbol.iterator屬性的數據結構,就稱為部署了遍歷器接口。調用這個接口,就會返回一個遍歷器對象。

4、在ES6中,有三類數據結構原生具備Iterator接口:數組、某些類似數組的對象、Set和Map結構。

5、一個為對象添加Iterator接口的例子。

技術分享圖片
let obj = {
  data: [ ‘hello‘, ‘world‘ ],
  [Symbol.iterator]() {
    const self = this;
    let index = 0;
    return {
      next() {
        if (index < self.data.length) {
          return {
            value: self.data[index++],
            done: false
          };
        } else {
          return { value: undefined, done: true };
        }
      }
    };
  }
};
技術分享圖片

6、下面是類似數組的對象調用數組的Symbol.iterator方法的例子。

技術分享圖片
let iterable = {
  0: ‘a‘,
  1: ‘b‘,
  2: ‘c‘,
  length: 3,
  [Symbol.iterator]: Array.prototype[Symbol.iterator]
};
for (let item of iterable) {
  console.log(item); // ‘a‘, ‘b‘, ‘c‘
}
技術分享圖片

註意,普通對象部署數組的Symbol.iterator方法,並無效果。

7、有一些場合會默認調用Iterator接口(即Symbol.iterator

方法),除了下文會介紹的for...of循環,還有幾個別的場合。

  • 解構賦值
  • 擴展運算符(...)
  • yield*_yield*後面跟的是一個可遍歷的結構,它會調用該結構的遍歷器接口。
  • 由於數組的遍歷會調用遍歷器接口,所以任何接受數組作為參數的場合,其實都調用

8、字符串是一個類似數組的對象,也原生具有Iterator接口。

9、遍歷器對象除了具有next方法,還可以具有return方法和throw方法。如果你自己寫遍歷器對象生成函數,那麽next方法是必須部署的,return方法和throw方法是否部署是可選的。

Iterator 遍歷器