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結構。