1. 程式人生 > >ES6——給物件部署Iterator介面

ES6——給物件部署Iterator介面

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}