瞭解下JS中的Iterator(迭代器)
阿新 • • 發佈:2020-12-14
技術標籤:js
物件的成員可以遍歷,因為該物件實現了Iterator 介面。
for (let i of [1,2]) {
console.log(i);
}
任何資料結構只要部署 Iterator 介面,就可以完成遍歷操作,即依次處理該資料結構的所有成員。
迭代器本質
迭代器物件本質上,就是一個指標物件。通過指標物件的next方法,用來移動指標。
一個符合【迭代器協議】的物件必須要有一個next屬性,next屬性也是一個無參函式。
【迭代器協議】物件必須提供一個next方法,執行該方法要麼返回迭代中的下一項,要麼就引起一個Stopiteration異常,以終止迭代。
next
方法返回一個物件,表示當前資料成員的資訊。這個物件具有value和done兩個屬性,value屬性返回當前位置的成員,done屬性是一個布林值,表示遍歷是否結束,即是否還有必要再一次呼叫next方法。對於遍歷器物件來說,done: false
value: undefined
屬性都是可以省略的。
ES6 規定,預設的 Iterator 介面部署在資料結構的Symbol.iterator屬性上。
原生物件的Iterator 介面
原生具備 Iterator 介面的資料結構如下。
- Array
- Map
- Set
- String
- TypedArray
- 函式的 arguments 物件
- NodeList 物件
可以看到Array原型物件實現了Iterator 介面。
那麼陣列的例項物件也具備這個Symbol.iterator屬性。呼叫試試看:
const arrayIterator=[1,2][Symbol.iterator]();
console.log (arrayIterator);
console.log(arrayIterator.next());
console.log(arrayIterator.next());
console.log(arrayIterator.next());
瞭解Symbol.iterator
Symbol.iterator屬性與Iterator介面大致關係:
物件內定義了一個Symbol型別且描述符為Symbol.iterator的屬性名,指向Iterator函式。