JS遍歷數(shù)組的十五種方法
一、循環(huán)遍歷
for循環(huán),也是最常見的。
可以使用臨時(shí)變量,將長(zhǎng)度緩存起來,避免重復(fù)獲取數(shù)組長(zhǎng)度,當(dāng)數(shù)組較大時(shí)優(yōu)化效果才會(huì)比較明顯。
二、for of遍歷
三、for in遍歷
四、forEach()遍歷
這種方法只是使處理需要循環(huán)的數(shù)組變得更加容易,因?yàn)槟悴槐叵裢ǔD菢訉懗霰恐囟L(zhǎng)的for循環(huán)語句。
forEach() 方法用于調(diào)用數(shù)組的每個(gè)元素,并將元素傳遞給回調(diào)函數(shù),沒有返回值,原數(shù)組不變。
forEach() 對(duì)于空數(shù)組是不會(huì)執(zhí)行回調(diào)函數(shù)的。
注意和map方法區(qū)分。
五、map()映射遍歷
map() 方法返回一個(gè)新數(shù)組,數(shù)組中的元素為原始數(shù)組元素調(diào)用函數(shù)處理后的值,并沒有改變?cè)瓉淼臄?shù)組。
map() 方法按照原始數(shù)組元素順序依次處理元素。
注意:map() 不會(huì)對(duì)空數(shù)組進(jìn)行檢測(cè)。
六、filter()過濾遍歷
將所有元素進(jìn)行判斷,將滿足條件的元素作為一個(gè)新的數(shù)組返回, 原數(shù)組不變。
注意:filter() 不會(huì)對(duì)空數(shù)組進(jìn)行檢測(cè)。
七、find()遍歷
數(shù)組中的每個(gè)元素都調(diào)用一次函數(shù)執(zhí)行。
當(dāng)數(shù)組中的元素在測(cè)試條件時(shí)返回true,find()返回符合條件的元素,之后的值不會(huì)再執(zhí)行函數(shù);如果沒有符合條件的元素則返回undefined,原數(shù)組不變。
注意::find() 對(duì)于空數(shù)組,函數(shù)是不會(huì)執(zhí)行的。
八、findIndex()遍歷
遍歷數(shù)組,找到第一個(gè)符合條件的元素,并返回該元素;否則,返回-1。
不改變?cè)瓟?shù)組。
九、indexOf()遍歷
從前往后遍歷數(shù)組,找到第一個(gè)符合條件的項(xiàng),并返回該項(xiàng)。否則返回-1。
不改變?cè)瓟?shù)組。
字符串也有此方法,功能類似。
十、lastIndexOf()遍歷
從后往前遍歷數(shù)組,找到第一個(gè)符合條件的項(xiàng),并返回該項(xiàng)。否則返回-1。
不改變?cè)瓟?shù)組。
字符串也有此方法,功能類似。
十一、every()遍歷
將所有元素進(jìn)行判斷,返回一個(gè)布爾值,原數(shù)組不變。
如果所有元素都滿足判斷條件,則返回true,否則為false。
注意:every() 不會(huì)對(duì)空數(shù)組進(jìn)行檢測(cè)。
十二、some()遍歷
將所有元素進(jìn)行判斷, 返回一個(gè)布爾值, 原數(shù)組不變。
如果存在元素滿足判斷條件,則返回true,若所有元素都不滿足判斷條件,則返回false。
判斷條件注意和every方法區(qū)分。
十三、reduce高階函數(shù)(迭代(累加器))
十四、reduceRight()遍歷
接收一個(gè)函數(shù)作為累加器(accumulator),數(shù)組中的每個(gè)值(從右到左)開始縮減,最終為一個(gè)值。
第二個(gè)參數(shù)作為第一次調(diào)用的a的值。
十五、遍歷器機(jī)制
截止到ES6,JavaScript 已經(jīng)擁有了數(shù)組、對(duì)象、Map集合和Set集合這樣四種數(shù)據(jù)結(jié)構(gòu)。
為了統(tǒng)一和簡(jiǎn)化遍歷這四種數(shù)據(jù)結(jié)構(gòu)的操作,ES6引入了遍歷器機(jī)制。
ES6 規(guī)定,可遍歷的對(duì)象都具有Symbol.iterator 屬性,這個(gè)屬性指向一個(gè)函數(shù),就是當(dāng)前對(duì)象默認(rèn)的遍歷器生成函數(shù)。
這個(gè)遍歷器生成函數(shù)大致的模樣可以用ES5 語法模擬出來:這個(gè)函數(shù)返回一個(gè)next() 方法,每調(diào)用next() 方法,都會(huì)返回?cái)?shù)據(jù)結(jié)構(gòu)的當(dāng)前成員的信息。
具體來說,就是返回一個(gè)包含value和done兩個(gè)屬性的對(duì)象。
其中,value屬性是當(dāng)前成員的值,done屬性是一個(gè)布爾值,表示遍歷是否結(jié)束。
在ES6 中,已經(jīng)默認(rèn)為絕大多數(shù)內(nèi)建的數(shù)據(jù)結(jié)構(gòu)提供了遍歷器,不需要自己去創(chuàng)建。
每個(gè)數(shù)據(jù)結(jié)構(gòu)都有一個(gè)默認(rèn)的遍歷器,例如數(shù)組的默認(rèn)遍歷器是values(),在沒有明確指定遍歷器的情況下,這些數(shù)據(jù)結(jié)構(gòu)都會(huì)使用默認(rèn)的遍歷器。
我們可以通過檢測(cè)對(duì)象的Symbol.iterator屬性來判斷對(duì)象是否擁有遍歷器。
原生具備遍歷器的對(duì)象:
數(shù)組、Map集合、Set集合、字符串、arguments和 NodeList(節(jié)點(diǎn)列表)。
對(duì)象(Object)默認(rèn)是不可遍歷的,我們可以通過Object.keys()、Object.values()和Object.entries() 方法把對(duì)象變成數(shù)組,使其擁有遍歷器;或者直接為對(duì)象添加Symbol.iterator 屬性來自定義遍歷器。