ES6的Iterator對象詳解

Iterator實現原理

  1. 建立一個指針對象,指向當前數據結構的起始位置。也就是說,遍歷器對象本質上,就是一個指針對象。數組

  2. 第一次調用指針對象的next方法,能夠將指針指向數據結構的第一個成員。數據結構

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

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

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

ES6 裏的迭代器並非一種新的語法或者是新的內置對象(構造函數), 而是一種協議,全部遵循了這個協議的對象均可以稱之爲迭代器對象,因此說迭代器是一種協議,一個統一的接口標準,兩個屬性都不返回值也不會報錯,可是不符合協議標準了,就不能稱做迭代器了對象

如何部署Iterator接口

在ES6中,有三類數據結構原生具有Iterator接口:數組、某些相似數組的對象、Set和Map結構,對象(Object)之因此沒有默認部署Iterator接口,是由於對象的哪一個屬性先遍歷,哪一個屬性後遍歷是不肯定的,須要開發者手動指定。接口

Iterator接口部署在對象的Symbol.Iterator屬性上, 能夠調用這個屬性,就獲得遍歷器對象。開發

var arr = ['a', 'b', 'c'];
     var iterator = arr[Symbol.iterator]();
     var a = iterator.next();
     console.log(a)   //{value: 'a', done: false}

for--of與for--in

for...in 遍歷每個屬性名稱,而 for...of遍歷每個屬性值。部署

在對象沒有部署Iterator接口的狀況下調用for...of會報錯。當一個部署了Iterator接口的對象調用for...of時,
實現的步驟是這樣的:it

  1. 調用對象的Symbol.Iterator的屬性得到遍歷器生成函數;

  2. 調用遍歷器生成函數返回遍歷器對象其實for...of就至關於一直調用遍歷器對象的next方法,直到返回done爲true;

相關文章
相關標籤/搜索