Iterator 遍歷器
阿新 • • 發佈:2018-08-27
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 遍歷器