遍歷器(Iterator)就是這樣一種機制。它是一種接口,為各種不同的資料結構提供統一的存取機制。任何資料結構只要部署Iterator接口,就可以完成遍歷操作(即依序處理該資料結構的所有成員)。
作用:
為各種資料結構,提供一個統一的、簡單的存取介面
使得資料結構的成員能夠依某種次序排列
ES6創造了一種新的遍歷指令for...of
循環,Iterator介面主要供for ...of
消費
Iterator的遍歷過程:
(1)建立一個指針對象,指向目前資料結構的起始位置。也就是說,遍歷器物件本質上,就是一個指針對象。
(2)第一次呼叫指標針對象的next
方法,可以將指標指向資料結構的第一個成員。
(3)第二次呼叫指標針對象的next
方法,指標就指向資料結構的第二個成員。
(4)不斷呼叫指向象的next
方法,直到它指向資料結構的結束位置。
在ES6中,有三類資料結構原生具備Iterator介面:陣列、某些類似陣列的物件、Set和Map結構。
可以覆寫原生的Symbol.iterator
方法,達到修改遍歷器行為的目的。
for...of迴圈可以使用的範圍包括陣列、Set和Map結構、某些類似陣列的物件(例如arguments物件、DOM NodeList物件) 、後文的Generator對象,以及字串。
{ let arr=['hello','world']; let map=arr[Symbol.iterator](); //done表示是否还有下一步了,false有 true 没有 console.log(map.next()); //{value: "hello", done: false} console.log(map.next()); //{value: "world", done: false} console.log(map.next()); //{value: undefined, done: true}} { let obj={ start:[1,3,2], end:[7,9,8], //声明 [Symbol.iterator](){ //函数体 let self=this; let index=0; //当前遍历索引 let arr=self.start.concat(self.end); //合并数组 let len=arr.length;//记住数组长度 return { //iterator部署的时候一定要有next这个方法 next(){ //遍历过程 if(index<len){ return { value:arr[index++], done:false } }else{ return { value:arr[index++], done:true //遍历结束 } } } } } } //验证接口是否部署成功 for(let key of obj){ console.log('key1',key); //1 3 2 7 9 8 } } { let arr=['hello','world']; for(let value of arr){ console.log('value',value); //hello ,world } }
以上是JavaScript ES6語法中iterator與for...of迴圈的範例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!