1. 程式人生 > 其它 >瞭解下JS中的Iterator(迭代器)

瞭解下JS中的Iterator(迭代器)

技術標籤: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函式。