JavaScript中forEach遍歷數(shù)組舉例詳解
前言
JavaScript 中 forEach
方法是一種常見(jiàn)且非常有用的數(shù)組遍歷方式,廣泛用于對(duì)數(shù)組中的每個(gè)元素執(zhí)行某種操作。本文將詳細(xì)介紹 forEach
方法的使用方式、優(yōu)缺點(diǎn)以及實(shí)際應(yīng)用場(chǎng)景,幫助開(kāi)發(fā)者更好地掌握這一常見(jiàn)的數(shù)組遍歷技術(shù)。
一、forEach 方法概述
1. forEach 方法簡(jiǎn)介
forEach
是 JavaScript 數(shù)組的一個(gè)原型方法,用于對(duì)數(shù)組中的每個(gè)元素依次執(zhí)行給定的函數(shù)。與傳統(tǒng)的 for
循環(huán)不同,forEach
通過(guò)回調(diào)函數(shù)的形式來(lái)處理數(shù)組元素,簡(jiǎn)化了數(shù)組遍歷的代碼書(shū)寫(xiě),并提高了代碼的可讀性和可維護(hù)性。
2. 語(yǔ)法結(jié)構(gòu)
forEach
方法的基本語(yǔ)法如下:
array.forEach(function(currentValue, index, array) { // 執(zhí)行的操作 });
currentValue
:數(shù)組中正在處理的當(dāng)前元素。index
:當(dāng)前元素的索引(可選)。array
:當(dāng)前正在遍歷的數(shù)組(可選)。
3. forEach 方法的特性
- 不改變?cè)瓟?shù)組:
forEach
方法只會(huì)對(duì)數(shù)組中的每個(gè)元素執(zhí)行回調(diào)函數(shù),不會(huì)修改原數(shù)組本身。 - 無(wú)法中途停止:
forEach
方法無(wú)法通過(guò)break
或return
提前終止循環(huán)。如果需要中途退出循環(huán),應(yīng)該考慮使用for
循環(huán)或some
、every
等方法。
二、forEach 方法的基本用法
1. 遍歷數(shù)組元素
forEach
最常見(jiàn)的用途就是遍歷數(shù)組中的元素,對(duì)每個(gè)元素執(zhí)行相應(yīng)的操作。以下是一個(gè)簡(jiǎn)單的示例:
const numbers = [1, 2, 3, 4, 5]; numbers.forEach(function(number) { console.log(number); });
輸出結(jié)果:
1
2
3
4
5
在這個(gè)示例中,forEach
方法會(huì)依次遍歷 numbers
數(shù)組,并對(duì)每個(gè)元素執(zhí)行 console.log
操作,輸出對(duì)應(yīng)的值。
2. 使用索引
forEach
方法的第二個(gè)參數(shù) index
可以用來(lái)獲取當(dāng)前元素的索引。在某些情況下,索引信息對(duì)處理數(shù)組元素非常有用。例如:
const fruits = ['apple', 'banana', 'cherry']; fruits.forEach(function(fruit, index) { console.log(`${index}: ${fruit}`); });
輸出結(jié)果:
0: apple
1: banana
2: cherry
3. 訪(fǎng)問(wèn)原數(shù)組
除了當(dāng)前元素和索引外,forEach
方法還可以訪(fǎng)問(wèn)正在遍歷的數(shù)組本身。雖然在大多數(shù)情況下不需要直接操作原數(shù)組,但在某些場(chǎng)景下,這個(gè)特性非常有用。例如:
const letters = ['a', 'b', 'c']; letters.forEach(function(letter, index, array) { console.log(array); });
輸出結(jié)果:
['a', 'b', 'c']
['a', 'b', 'c']
['a', 'b', 'c']
每次回調(diào)函數(shù)執(zhí)行時(shí),array
參數(shù)都會(huì)指向原數(shù)組。
三、forEach 方法的實(shí)際應(yīng)用
1. 修改 DOM 元素
forEach
可以用于遍歷頁(yè)面上的元素集合,并對(duì)每個(gè)元素進(jìn)行操作。例如,通過(guò) forEach
遍歷所有的 div
元素,并為它們添加一個(gè)類(lèi):
const divs = document.querySelectorAll('div'); divs.forEach(function(div) { div.classList.add('highlight'); });
在這個(gè)例子中,forEach
遍歷了所有 div
元素,并為每個(gè) div
元素添加了 highlight
類(lèi)。
2. 累加數(shù)組元素
forEach
也可以用于累加數(shù)組中的元素。雖然 reduce
方法在累加操作中更常用,但 forEach
也能達(dá)到類(lèi)似的效果:
const numbers = [10, 20, 30]; let sum = 0; numbers.forEach(function(number) { sum += number; }); console.log(sum); // 60
3. 異步操作
雖然 forEach
是同步執(zhí)行的,但它可以很好地與異步操作結(jié)合使用。例如,遍歷一組數(shù)據(jù)并對(duì)每個(gè)數(shù)據(jù)項(xiàng)進(jìn)行異步請(qǐng)求:
const urls = ['url1', 'url2', 'url3']; urls.forEach(async function(url) { const response = await fetch(url); const data = await response.json(); console.log(data); });
在這個(gè)例子中,forEach
結(jié)合 async/await
,為每個(gè) URL 發(fā)送請(qǐng)求并輸出返回的數(shù)據(jù)。
四、forEach 方法的優(yōu)缺點(diǎn)
1. 優(yōu)點(diǎn)
- 簡(jiǎn)潔優(yōu)雅:
forEach
的語(yǔ)法簡(jiǎn)潔明了,代碼可讀性高,特別是與傳統(tǒng)的for
循環(huán)相比。 - 無(wú)需管理索引:
forEach
自動(dòng)處理索引,無(wú)需像for
循環(huán)那樣手動(dòng)初始化、遞增索引變量,減少了出錯(cuò)的可能性。 - 不改變?cè)瓟?shù)組:
forEach
方法不會(huì)修改原數(shù)組,保證了數(shù)據(jù)的不可變性,符合函數(shù)式編程的理念。
2. 缺點(diǎn)
- 無(wú)法中斷循環(huán):
forEach
無(wú)法中途停止循環(huán),無(wú)法通過(guò)break
或return
來(lái)提前退出。對(duì)于需要條件判斷的場(chǎng)景,for
或every
、some
方法可能是更好的選擇。 - 性能問(wèn)題:在某些情況下,
forEach
的性能可能不如for
循環(huán)。在需要進(jìn)行高性能、大規(guī)模數(shù)據(jù)處理的場(chǎng)景中,傳統(tǒng)的for
循環(huán)有時(shí)會(huì)表現(xiàn)得更好。 - 異步處理:
forEach
不適用于異步循環(huán),因?yàn)樗粫?huì)等待異步操作完成。雖然可以結(jié)合async/await
使用,但這并非它的主要設(shè)計(jì)用途。
五、forEach 與其他遍歷方法的對(duì)比
1. for 循環(huán)
for
循環(huán)是最基礎(chǔ)的數(shù)組遍歷方法,可以靈活控制遍歷的開(kāi)始、結(jié)束條件及增量。與 forEach
相比,for
循環(huán)可以通過(guò) break
提前退出,但代碼相對(duì)繁瑣。
for (let i = 0; i < array.length; i++) { // 邏輯 }
2. map 方法
map
方法與 forEach
類(lèi)似,都是對(duì)數(shù)組元素進(jìn)行遍歷,但 map
方法會(huì)返回一個(gè)新數(shù)組。forEach
適用于只需要遍歷但不返回新數(shù)組的場(chǎng)景,而 map
適合在遍歷的同時(shí)生成新的數(shù)組。
const numbers = [1, 2, 3]; const doubled = numbers.map(function(number) { return number * 2; }); console.log(doubled); // [2, 4, 6]
3. filter 方法
filter
方法也是遍歷數(shù)組的一種方式,它會(huì)根據(jù)回調(diào)函數(shù)的返回值生成一個(gè)新的數(shù)組,包含所有返回 true
的元素。相比之下,forEach
只執(zhí)行回調(diào)函數(shù),不生成新數(shù)組。
const numbers = [1, 2, 3, 4, 5]; const evens = numbers.filter(function(number) { return number % 2 === 0; }); console.log(evens); // [2, 4]
六、注意事項(xiàng)
1. 不要修改原數(shù)組
盡量避免在 forEach
方法內(nèi)部修改原數(shù)組,雖然 forEach
不會(huì)改變數(shù)組,但在回調(diào)函數(shù)中對(duì)原數(shù)組的修改可能會(huì)導(dǎo)致意料之外的結(jié)果。
2. 異步場(chǎng)景的處理
如前所述,forEach
不適合異步操作。在需要處理異步請(qǐng)求的場(chǎng)景中,使用 for...of
循環(huán)結(jié)合 async/await
通常是更好的選擇。
七、總結(jié)
forEach
是 JavaScript 中一個(gè)非常強(qiáng)大且易于使用的數(shù)組遍歷方法。它簡(jiǎn)化了數(shù)組操作的代碼書(shū)寫(xiě),特別適合需要對(duì)數(shù)組元素執(zhí)行某些操作的場(chǎng)景。然而,forEach
也有其局限性,如無(wú)法中途退出和不適用于異步操作。因此,在實(shí)際開(kāi)發(fā)中,應(yīng)該根據(jù)具體需求選擇最合適的數(shù)組遍歷方式。
到此這篇關(guān)于JavaScript中forEach遍歷數(shù)組的文章就介紹到這了,更多相關(guān)JS中forEach遍歷數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JavaScript中的數(shù)組遍歷forEach()與map()方法以及兼容寫(xiě)法介紹
- Javascript數(shù)組循環(huán)遍歷之forEach詳解
- JavaScript使用forEach()與jQuery使用each遍歷數(shù)組時(shí)return false 的區(qū)別
- JavaScript遍歷數(shù)組的三種方法map、forEach與filter實(shí)例詳解
- js/jquery遍歷對(duì)象和數(shù)組的方法分析【forEach,map與each方法】
- Vue中foreach數(shù)組與js中遍歷數(shù)組的寫(xiě)法說(shuō)明
- JS數(shù)組遍歷中for,for in,for of,map,forEach各自的使用方法與優(yōu)缺點(diǎn)
- JS中的常見(jiàn)數(shù)組遍歷案例詳解(forEach,?map,?filter,?sort,?reduce,?every)
相關(guān)文章
JS實(shí)現(xiàn)520 表白簡(jiǎn)單代碼
本文是小編基于js實(shí)現(xiàn)的520表白代碼,代碼簡(jiǎn)單易懂非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-05-05JavaScript中Iterator迭代器接口和循環(huán)
這篇文章主要介紹了JavaScript中Iterator迭代器接口和循環(huán),迭代器是數(shù)據(jù)結(jié)構(gòu)遍歷的一種機(jī)制迭代器主要是提供for...of使用,更多相關(guān)內(nèi)推需要的小伙伴可以參考下面文章內(nèi)容2022-06-06layui 上傳插件 帶預(yù)覽 非自動(dòng)上傳功能的實(shí)例(非常實(shí)用)
今天小編就為大家分享一篇layui 上傳插件 帶預(yù)覽 非自動(dòng)上傳功能的實(shí)例(非常實(shí)用),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09JS函數(shù)進(jìn)階之prototy用法實(shí)例分析
這篇文章主要介紹了JS函數(shù)進(jìn)階之prototy用法,結(jié)合實(shí)例形式分析了JavaScript函數(shù)中使用prototy擴(kuò)展屬性相關(guān)操作技巧,需要的朋友可以參考下2020-01-01ES6?Promise.all的使用方法以及其細(xì)節(jié)詳解
Promise對(duì)象用于表示一個(gè)異步操作的最終完成(或失敗)及其結(jié)果值,下面這篇文章主要給大家介紹了關(guān)于ES6?Promise.all的使用方法以及其細(xì)節(jié)的相關(guān)資料,需要的朋友可以參考下2022-07-07Cropper.js進(jìn)階之實(shí)現(xiàn)圓形頭像裁剪功能示例
這篇文章主要為大家介紹了Cropper.js進(jìn)階之實(shí)現(xiàn)圓形頭像裁剪功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05