1.數(shù)據(jù)結(jié)構(gòu)只要有Symbol.iterator函數(shù)就可遍歷
var array = ["a","b","c"];
var iterator = array[Symbol.iterator]();
console.log(iterator.next());//{ value: 'a', done: false }
2.原生的具有iterator接口的數(shù)據(jù)結(jié)構(gòu)有
array
set
map
arguments
NodeList
3.使用到Symbol.iterator的情況
- 解構(gòu)賦值
- 擴(kuò)展運(yùn)算符...
- yield(yeild用來暫停和繼續(xù)執(zhí)行生成器函數(shù),當(dāng)外部調(diào)用生成器函數(shù)的next,yeild的右側(cè)的表達(dá)式才會(huì)執(zhí)行)
- 可以覆蓋原有的Symbol.iterator函數(shù)
4.遍歷器對(duì)象的return()绢涡,throw()
- 引發(fā)return()函數(shù)票渠,發(fā)生在for...of中出現(xiàn)break,continue,throw new Error();
5.for...of for..in的區(qū)別
- for...of必須部署了iterator接口后可使用
- for...of只能夠遍歷有數(shù)字索引的屬性
- for..of可以識(shí)別32位的UTF-16字符
- for...in的缺點(diǎn)
1)數(shù)組的鍵名是數(shù)字田绑,但是for...in循環(huán)是以字符串作為鍵名“0”鳞尔、“1”长酗、“2”等
2)for...in循環(huán)不僅遍歷數(shù)字鍵名,還會(huì)遍歷手動(dòng)添加的其他鍵蜘拉,甚至包括原型鏈上的鍵。
3)某些情況下有鹿,for...in循環(huán)會(huì)以任意順序遍歷鍵名
6.對(duì)于array旭旭,set,map的遍歷函數(shù)
values( )葱跋;
keys( )持寄;
entries( );//返回結(jié)果是[index, value];
7.對(duì)于沒有iterator接口的對(duì)象可使用Array.from()轉(zhuǎn)換成數(shù)組后進(jìn)行遍歷