日期:2020 年 8 月 13 日
map 與 forEach 的比較
基本定義及使用
定義
map
map() 方法創(chuàng)建一個新數組封孙,其結果是該數組中的每個元素是調用一次提供的函數后的返回值
forEach
forEach() 方法對數組的每個元素執(zhí)行一次給定的函數
語法
// map 用法
var new_array = arr.map(function callback(currentValue[, index[, array]]) {
// Return element for new_array
}[, thisArg])
// forEach 用法
arr.forEach(callback(currentValue [, index [, array]])[, thisArg])
異同對比
相同點
都是用來遍歷一個數組并對數組的每一項執(zhí)行給定的函數
不同點
- 從它們各自的定義中即可發(fā)現數組調用 map 方法之后會返回一個新的數組,而數組調用 forEach 之后是沒有返回值讽营,即一定返回 undefined
注意:map 返回的新數組的各項就是原數組每一項調用 callback 之后的返回值虎忌,所以這也要求 map 中的 callback 一定要有返回值,同時橱鹏,map 會返回一個新數組也決定了 map 之后可以繼續(xù)進行鏈式操作膜蠢,而 forEach 因為沒有返回值堪藐,所以后面就不能再接其他操作了
- 它們的使用場景不同,map 適用于需要更改數組的場景挑围,而 forEach 更適用于打印數組內容礁竞,并且 forEach 除了拋出異常以外,沒有辦法中止或跳出循環(huán)贪惹,若要提前結束循環(huán)苏章,則可以使用 for 循環(huán)、for···of奏瞬、for···in枫绅、every、some硼端、find并淋、findIndex,對于需要判斷一個數組是否滿足條件并返回 true 或 false 的場景可以用 every() 或者 some()珍昨,具體使用場景查看 MDN-forEach
常見誤區(qū)
另外县耽,對于網上的一些說 map 不修改原數組,返回新數組镣典,而 forEach 會修改原數組的說法兔毙,在下也實在不敢茍同。實際上兄春,這兩個方法都不會修改原數組澎剥,但是當數組的元素為一個引用類型的元素時,如果我們對其進行了修改赶舆,那么原數組是會改變的哑姚,看兩個例子:
當操作的數組元素為基本數據類型時:
當操作的數組元素為引用類型時:
這是因為 map 和 forEach 的 callback 在操作數組元素時實際上是下面這樣操作的:callback.call([thisArg], this[index], index, this)
,當數組元素為引用類型時芜茵, this[index] 取到的實際只是一個指向對應元素的地址叙量,這種情況下再進行修改操作,修改的是堆中的對象的內容九串,那當我們再次去讀取原數組中內容時绞佩,讀到這個引用類型的元素時,我們拿到的還是那個地址蒸辆,不過它指向的堆中的內容卻已經變了