今天小黑被大佬問(wèn)了這個(gè)問(wèn)題田巴,答案總是模模糊糊的,于是乎百度一哈:
很多的內(nèi)容來(lái)源于:
for in 和for of的區(qū)別 - 簡(jiǎn)書(shū)?
1 forEach?
ES5具有遍歷數(shù)組功能的還有map,filter,some缚甩,every,reduce榨惰,reduceRight等:使用foreach遍歷數(shù)組的話,是不能被break 和 return 返回到外層函數(shù)静汤;
這里我還有一個(gè)誤解琅催,以為return會(huì)報(bào)錯(cuò) ,沒(méi)想到只是相當(dāng)于continue虫给;
2 for? in?
(1) for in 返回的是數(shù)組的索引藤抡。是字符串型數(shù)字;
(2)遍歷順序有可能不是按實(shí)際數(shù)組的內(nèi)部順序;
(3)使用for in 會(huì)遍歷數(shù)組所有的可枚舉屬性抹估,包括原型方法method 和 name 屬性缠黍;
由此可見(jiàn),for in 更適合遍歷對(duì)象药蜻,不要使用for in 遍歷數(shù)組瓷式;
for in 遍歷對(duì)象
通常用for in 來(lái)遍歷對(duì)象的鍵名:
for in 可以遍歷到myObject的原型方法method。如果不想遍歷原型方法和屬性的話语泽,可以在循環(huán)內(nèi)部判斷一下贸典,hasOwnPropery方法可以判斷某屬性是否是該對(duì)象的實(shí)例屬性;同樣可以通過(guò)Object.keys(myObject)獲取對(duì)象的實(shí)例屬性組成的數(shù)組踱卵,不包括原型方法和屬性廊驼;
3 for of?
for of遍歷的是數(shù)組元素值,返回的只是數(shù)組內(nèi)的元素惋砂,而不包括數(shù)組的原型屬性和索引name
for of 使用遍歷數(shù)組妒挎,數(shù)組對(duì)象,字符串 西饵,map酝掩,set等御用迭代器對(duì)象的集合,但是不能遍歷對(duì)象眷柔,因?yàn)闆](méi)有迭代器對(duì)象庸队,和forEach不同积蜻,他可以正常響應(yīng)break闯割,continue和return彻消;
for-of 不支持普通對(duì)象,但是如果想要迭代一個(gè)對(duì)象的屬性宙拉,可以用for in 循環(huán)宾尚。或者內(nèi)奸的Object.keys方法谢澈;
遍歷map對(duì)象時(shí)適合用解構(gòu)煌贴。直接拿到key值和value 值;
當(dāng)為對(duì)象添加了toString()方法后锥忿,就可以將對(duì)象轉(zhuǎn)化為字符串牛郑,同樣的,可以向任意對(duì)象添加Symbol.iterator方法敬鬓;就可以遍歷這個(gè)對(duì)象了淹朋;
for of的步驟:
for of 循環(huán)首先調(diào)用集合的Symbol.iterator方法,緊接著返回一個(gè)新的迭代器對(duì)象钉答,迭代器對(duì)象可以被視為具有.next()方法的對(duì)象础芍;for-of循環(huán)將重復(fù)調(diào)用這個(gè)方法,每次循環(huán)調(diào)用一次数尿;