|
|
|
|
|
在 JavaScript 中,forEach
和map
是兩種最流行的處理數(shù)組的方法。這兩種方法的主要目的是遍歷數(shù)組。盡管它們看起來幾乎相同,但它們之間存在某些差異。在本文中,我們將討論JavaScript 中的map
和forEach
方法,我們還將通過它們之間的差異來了解何時(shí)使用它們。
forEach
方法
forEach
方法允許你通過遍歷數(shù)組的每個(gè)元素來執(zhí)行函數(shù)。重要的是要注意該forEach
方法不返回任何內(nèi)容,因此,如果你嘗試獲取forEach
方法的返回值,則會(huì)得到 undefined。相反,它允許你通過在數(shù)組的每個(gè)元素上應(yīng)用回調(diào)函數(shù)來修改現(xiàn)有數(shù)組的值。由于它允許你修改源數(shù)組本身,因此它是一個(gè) mutator
方法。
我們查看以下示例以了解forEach
方法的工作原理。
//a logging utility output text to the web page
const output=(string)=>document.body.innerHTML+=`${string}<br/>`;
//an array of numbers
let numberArray = [1, 2, 3, 4, 5];
//output the square of each number
let returnValue = numberArray.forEach((num, index) =>
output(`${num} x ${num} = ${num * num}`);
);
//the array hasn't changed
output(numberArray);
output(returnValue);
示例中,我們計(jì)算數(shù)組所有元素的平方。對(duì)每個(gè)元素調(diào)用 forEach
方法,我們記錄它的平方。這個(gè)輔助方法的返回值被忽略,原始數(shù)組不會(huì)改變。forEach
的返回值始終為undefined。
map
方法
map
方法與forEach
方法非常相似——它允許你為數(shù)組的每個(gè)元素執(zhí)行一個(gè)函數(shù)。但不同之處在于 map
方法使用該函數(shù)的返回值創(chuàng)建了一個(gè)新數(shù)組。map
通過在源數(shù)組的每個(gè)元素上應(yīng)用回調(diào)函數(shù)來創(chuàng)建一個(gè)新數(shù)組。由于map
不改變?cè)磾?shù)組,我們可以說它是不可變的方法。
我們用map
修改上面的示例。
//a logging utility output text to the web page
const output=(string)=>document.body.innerHTML+=`${string}<br/>`;
//an array of numbers
let numberArray = [1, 2, 3, 4, 5];
//output the square of each number
let returnValue = numberArray.map((num) => num * num)
//view the results
output(numberArray);
output(returnValue);
可以看到,numberArray
數(shù)組保持不變,但map
返回值是一個(gè)新數(shù)組,該數(shù)組是通過將 square
函數(shù)應(yīng)用于數(shù)組的每個(gè)元素構(gòu)建的。
map
函數(shù)的一個(gè)優(yōu)點(diǎn)是它是可連接的。這意味著你可以連續(xù)調(diào)用多個(gè)map
操作。這是一個(gè)連接示例,我們將每個(gè)數(shù)字乘以 2,將它們轉(zhuǎn)換為字符串,然后在每個(gè)數(shù)字上加上一個(gè)美元符號(hào)。
//a logging utility output text to the web page
const output=(string)=>document.body.innerHTML+=`${string}<br/>`;
//an array of numbers
let numberArray = [1, 2, 3, 4, 5];
//output the square of each number
let returnValue = numberArray
.map((num) => num * 2)
.map((num) => num.toString())
.map((string) => "$"+string);
//view the results
output(numberArray);
output(returnValue);
輸出結(jié)果
1,2,3,4,5
$2,$4,$6,$8,$10
map
和 forEach
方法之間的差異
map
和forEach
之間的主要區(qū)別在于,map
方法通過對(duì)數(shù)組的每個(gè)元素應(yīng)用回調(diào)函數(shù)來返回一個(gè)新數(shù)組,而forEach
方法不返回任何內(nèi)容。
你可以使用forEach
方法來改變?cè)磾?shù)組,但這并不是它真正的用途。相反,當(dāng)你需要對(duì)數(shù)組的每個(gè)元素執(zhí)行某些操作時(shí),它非常有用。
而map
方法用于創(chuàng)建一個(gè)新數(shù)組,它是可連接的,你可以一個(gè)接一個(gè)地調(diào)用多個(gè)map
操作。
forEach
方法不返回任何內(nèi)容,因此你不能將它與任何其他方法連接起來——它不可連接。
我應(yīng)該使用哪一個(gè),map
還是forEach
?
現(xiàn)在,歸結(jié)為這個(gè)問題,如何決定是否應(yīng)該使用map
還是forEach
方法?
如果你打算通過應(yīng)用某個(gè)函數(shù)來更改數(shù)組元素,則應(yīng)該使用map
方法,因?yàn)樗粫?huì)修改原始數(shù)組并返回一個(gè)新數(shù)組。這樣,原來的數(shù)組就完好無損。而如果您想遍歷數(shù)組的所有元素并且不需要返回的數(shù)組,請(qǐng)使用forEach
方法。
除此之外,功能非常相似。
結(jié)論
今天,我們討論了 JavaScript 中兩個(gè)有用的方法:map
和forEach
. 我們通過幾個(gè)例子了解了它們之間的差異,并給出了一些使用建議,希望對(duì)大家有所幫助。