標籤:set 接受 迴圈 val blog rabl 數組 for 筆記
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方法是否部署是可選的。
js-ES6學習筆記-Iterator