是什么
一種接口,為各種不同的數(shù)據(jù)結(jié)構(gòu)提供統(tǒng)一的訪問機(jī)制。
任何數(shù)據(jù)結(jié)構(gòu)只要部署Iterator 接口,就可以完成遍歷操作(即依次處理該數(shù)據(jù)結(jié)構(gòu)的所有成員)。
作用
- 為各種數(shù)據(jù)結(jié)構(gòu),提供一個統(tǒng)一的、簡便的訪問接口
- 使得數(shù)據(jù)結(jié)構(gòu)的成員能夠按某種次序排列
-
ES6創(chuàng)造了一種新的遍歷命令for...of循環(huán),Iterator接口主要供for...of消費(fèi)
默認(rèn)Iterator 接口
ES6 規(guī)定,默認(rèn)的Iterator接口部署在數(shù)據(jù)結(jié)構(gòu)的Symbol.iterator屬性,或者說,一個數(shù)據(jù)結(jié)構(gòu)只要具有Symbol.iterator屬性,就可以認(rèn)為是“可遍歷的”(iterable)。Symbol.iterator屬性本身是一個函數(shù),就是當(dāng)前數(shù)據(jù)結(jié)構(gòu)默認(rèn)的遍歷器生成函數(shù)。執(zhí)行這個函數(shù),就會返回一個遍歷器。至于屬性名Symbol.iterator,它是一個表達(dá)式,返回Symbol對象的iterator屬性,這是一個預(yù)定義好的、類型為 Symbol 的特殊值,所以要放在方括號內(nèi)。
特征
- 根本特征:一種指針對象,具有
next方法。每次調(diào)用next方法,都會返回一個代表當(dāng)前成員的信息對象,具有value和done兩個屬性。value屬性是當(dāng)前成員的值,done屬性是一個布爾值,表示遍歷是否結(jié)束。 - 除了具有
next方法,還可以具有return方法和throw方法。- 如果自己寫遍歷器對象生成函數(shù),
next方法必須部署,return和throw方法可選部署。return()方法必須返回一個對象,這是Generator語法決定的。
return方法的使用場合:-
for...of循環(huán)提前退出(通常是因為出錯,或者有break語句) - 一個對象在完成遍歷前,需要清理或釋放資源
-
-
throw()方法主要是配合Generator函數(shù)使用,一般的遍歷器對象用不到這個方法。
- 如果自己寫遍歷器對象生成函數(shù),
最簡單實現(xiàn)
使用 Generator 函數(shù),只要用 yield 命令給出每一步的返回值即可。
let obj = {
* [Symbol.iterator]() {
yield 'hello';
yield 'world';
}
};
for (let x of obj) {
console.log(x);
}
內(nèi)置類型
ArrayMapSetStringTypedArray- 函數(shù)的
arguments對象 -
NodeList對象
場景
- 解構(gòu)賦值:默認(rèn)調(diào)用
- 擴(kuò)展運(yùn)算符(...)
yield*- 其他任何接受數(shù)組作為參數(shù)的場合
for...of- Array.from()
Map(), Set(), WeakMap(), WeakSet()(比如new Map([['a',1],['b',2]]))Promise.all()Promise.race()