13、ES6 Iterator(遍歷器)的概念

1. Iterator(遍歷器)的概念

JavaScript原有的表示“集合”的數據結構,主要是數組(Array)和對象(Object),ES6又添加了Map和Set。這樣就有了四種數據集合,用戶還可以組合使用它們,定義自己的數據結構,比如數組的成員是Map,Map的成員是對象。這樣就需要一種統一的接口機制,來處理所有不同的數據結構。


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


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


Iterator的遍歷過程是這樣的。(1)創建一個指針對象,指向當前數據結構的起始位置。也就是說,遍歷器對象本質上,就是一個指針對象。

(2)第一次調用指針對象的next 方法,可以將指針指向數據結構的第一個成員。

(3)第二次調用指針對象的next 方法,指針就指向數據結構的第二個成員。

(4)不斷調用指針對象的next 方法,直到它指向數據結構的結束位置。


每一次調用next方法,都會返回數據結構的當前成員的信息。具體來說,就是返回一個包含value 和done 兩個屬性的對象。其中,value 屬性是當前成員的值,done屬性是一個布爾值,表示遍歷是否結束。


Iterator接口的目的,就是爲所有數據結構,提供了一種統一的訪問機制,即for..of 循環(詳見下文)。當使用for..of 循環遍歷某種數據結構時,該循環會自動去尋找Iterator接口。

ES6規定,默認的Iterator接口部署在數據結構的 Symbol.iterator 屬性,或者說,一個數據結構只要具有Symbol.iterator屬性,就可以認爲是“可遍歷的”(iterable)。調用Symbol.iterator方法,就會得到當前數據結構默認的遍歷器生成函數。Symbol.iterator 本身是一個表達式,返回Symbol對象的iterator屬性,這是一個預定義好的、類型爲Symbol的特殊值,所以要放在方括號內。在ES6中,有三類數據結構原生具備Iterator接口:數組、某些類似數組的對象、Set和Map結構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章