當前位置:
首頁 > 知識 > Iterator:訪問數據集合的統一介面

Iterator:訪問數據集合的統一介面

導語

遍歷器 是 ES6 為訪問數據集合提供的統一介面。任何內部部署了遍歷器介面的數據集合,對於用戶來說,都可以使用相同方式獲取到相應的數據結構。如果使用的是最新版 瀏覽器,那麼你要知道——我們所熟悉的數組小姐,已悄悄的打開了另一扇可抵達她心扉的小徑。


1 正題

某個數據集合部署了 介面,是指其 屬性指向一個能返回 介面的函數。任何默認使用遍歷器訪問數據集合的方法,都會調用此屬性以得到遍歷器對象,再按照設定的順序依次訪問該數據結構的成員(關於 請看最後一節的延伸閱讀)。比如原生數組的遍歷器為 ,也可以直接通過其構造函數的原型獲取 。


1.1 基本行為

調用 介面會返回一個新的遍歷器對象(指針對象)。 對象中必然有 方法,用於訪問下一個數據成員。指針初始時指向當前數據結構的起始位置。

第一次調用對象的 方法,指針指向數據結構的第一個成員。 第二次調用對象的 方法,指針指向數據結構的第二個成員。 不斷的調用對象的 方法,直到它指向數據結構的結束位置。

每次調用 方法,都會返回相同的數據結構: 。 其中 表示當前指向成員的值,沒有則為 。 其中 是一個布爾值,表示遍歷是否結束,結束為 ,否則 。

遍歷器介面的標準十分簡潔,不提供諸如:操作內部指針、判斷是否有值等等方法。只需要一直不斷的調用 方法,當 為 時獲取當時的 , 為 時停止即可。第一次接觸遍歷器的行為模式是在 2016 的冬天,那時底蘊不夠雞毛也沒長全,理解不了簡潔性的適用和強大。直到現在——在即將打包被迫離開公司的前夕才驀然的醒覺。多麼痛的領悟啊。


1.2 簡單實現

面向不同的數據結構,有不同的遍歷器實現方法,我們簡單的實現下數組的遍歷器方法。

1.3 return & throw

除了為遍歷器對象部署 方法,還可以有 和 方法。其中 方法會在提前退出 循環時(通常是因為出錯,或觸發了 語句)被調用。而 方法主要是配合 函數使用,一般的遍歷器對象用不到這個方法,所以不予介紹。


2 原生支持

2.1 默認持有遍歷器

原生默認持有遍歷器介面的數據結構有: 基本類型: , , (四種基本數據集合: , , 和 )。 類數組對象: , , 。

遍歷器與先前的遍歷方法一個數據集合擁有遍歷器介面,並不意味著所有遍歷它的方法都是使用此介面。實際上,只有 ES6 新增的幾種方式和某些方法會使用,下面會有介紹。以數組來說,對其使用 和 雖然可訪問到相同的成員,但是實際的操作方式卻不同。

對象沒有默認的遍歷器介面為什麼對象沒有默認的遍歷器介面?這要從兩方面說明。一為遍歷器是種線性處理結構,對於任何非線性的數據結構,部署了遍歷器介面,就等於部署一種線性轉換。二是對象本來就是一個無序的集合,如果希望其有序,可以使用 代替。這即是各有其長,各安其職。屎殼郎如果不滾糞球而去采蜜,那,呃,花妹妹可能就遭殃咯。

為對象添加遍歷器介面,也不影響之前不使用遍歷器的方法,比如 , 等等(兩者不等同)。

2.2 默認調用遍歷器

for of是專門用來消費遍歷器的,其遍歷的是鍵值( 遍歷的是鍵名)。

擴展運算符無論是解構賦值或擴展運算都是默認調用遍歷器的。

yield* 在 函數中有 命令,如果其後面跟的是一個可遍歷的結構,它會調用該結構的遍歷器介面。

其它場合有些接受數組作為參數的函數,會默認使用數組的遍歷器介面,所以也等同於默認調用。比如 , 。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 JavaScript 的精彩文章:

後端說:只是你不懂怎麼用 headers!
用 npm script 打造超溜的前端工作流

TAG:JavaScript |