ES6——給物件部署Iterator介面
阿新 • • 發佈:2019-02-13
Iterator介面的目的就是為所有資料結構提供一種統一訪問的機制,用for...of實現。
一個數據結構只要有Symbol.iterator屬性,就可以認為是“可遍歷的”
原型部署了Iterator介面的資料結構有三種,具體包含四種,分別是陣列,類似陣列的物件,Set和Map結構。
為什麼物件(Object)沒有部署Iterator介面呢?
有兩個原因:一是因為物件的哪個屬性先遍歷,哪個屬性後遍歷是不確定的,需要開發者手動指定。然而遍歷遍歷器是一種線性處理,對於非線性的資料結構,部署遍歷器介面,就等於要部署一種線性轉換。二是對物件部署Iterator介面並不是很必要,因為Map彌補了它的缺陷,又正好有Iteraotr介面。
然後就會有人問了,既然有Map了,為什麼還要嘗試給物件部署Iterator介面呢?
答案很多啊,指不定哪天面試官就問了呢?指不定哪天你腦抽想用for...of來遍歷物件了呢?又或者是遇到死板的不願意相容ES6規則的那個啥呢?就四這麼任性!
//建立一個建構函式 function Obj(value){ this.value=value; this.nnext=null; } Obj.prototype[Symbol.iterator]=function(){ var iterator={next:next}; var current=this; function next(){ if(current){ var value=current.value; var done=current.next===null; current=current.next; return { value:value, done:done }; }else{ return {done:true}; } } return iterator; }
測試:
這裡需要說明的是,上面例子中的物件完整表示為{one:1,teo:2,three:3}