Iterator和for...of循環(huán)
1.Iterator遍歷器的概念
JS表示“集合”的數(shù)據(jù)結構有:Array,Object,Map,Set,這四種也可以組合使用。情況比較復雜,
需要一種統(tǒng)一的接口機制,來處理所有不同的數(shù)據(jù)結構--iterator遍歷器就是。
任何數(shù)據(jù)結構只要部署 Iterator 接口,就可以完成遍歷操作(即依次處理該數(shù)據(jù)結構的所有成員)。
Iterator的三個作用:
1.為各種數(shù)據(jù)結構,通過統(tǒng)一的、簡便的訪問接口;
2.使數(shù)據(jù)結構的成員能按照某種次序排列;
3.主要供ES6新的遍歷命令for...of消費
遍歷過程:具體略,主要點:遍歷器對象(指針對象),next方法,返回value,done(布爾值,遍歷是否結束)

2.默認Iterator接口
Iterator 接口的目的,就是為所有數(shù)據(jù)結構,提供了一種統(tǒng)一的訪問機制,即for...of循環(huán)。當使用for...of循環(huán)遍歷某種數(shù)據(jù)結構時,該循環(huán)會自動去尋找 Iterator 接口。
ES6 規(guī)定,默認的 Iterator 接口部署在數(shù)據(jù)結構的Symbol.iterator屬性,或者說,一個數(shù)據(jù)結構只要具有Symbol.iterator屬性,就可以認為是“可遍歷的”(iterable)

原生具備 Iterator 接口(即原生部署了Symbol.iterator屬性)的數(shù)據(jù)結構如下:

其他原生不具備Iterator的數(shù)據(jù)結構(主要是Object),都需要自己在Symbol.iterator屬性上面部署,例如上上圖所示
對象(Object)之所以沒有默認部署 Iterator 接口,是因為對象的哪個屬性先遍歷,哪個屬性后遍歷是不確定的,需要開發(fā)者手動指定。本質上,遍歷器是一種線性處理,對于任何非線性的數(shù)據(jù)結構,部署遍歷器接口,就等于部署一種線性轉換。
不過,嚴格地說,對象部署遍歷器接口并不是很必要,因為這時對象實際上被當作 Map 結構使用,ES5 沒有 Map 結構,而 ES6 原生提供了。
3.調用Iterator接口的場合
(1)解構賦值
(2)擴展運算符(...)
(3)yield*

(4)其他場合
由于數(shù)組的遍歷會調用遍歷器接口,所以任何接受數(shù)組作為參數(shù)的場合,其實都調用了遍歷器接口。下面是一些例子

4.字符串的Iterator接口

5.Iterator接口和Generator函數(shù)
Symbol.iterator方法的最簡單的實現(xiàn)就是使用Generator函數(shù)和yeild??先跳過,學了函數(shù)后再回顧
6.遍歷器對象的return()、throw()
return():遍歷沒有都完成(可能是因為出錯、有break語句、continue語句)時會執(zhí)行,該方法必須返回一個對象(這是 Generator 規(guī)格決定的)
throw方法主要是配合 Generator 函數(shù)使用,一般的遍歷器對象用不到這個方法。請參閱《Generator 函數(shù)》一章
7.for...of循環(huán)

與其他遍歷語法的比較:
for
forEach--array(中途無法跳出循環(huán))
for..in
