這兩個方法想必大家都很熟悉吧显晶,在項目中遍歷數(shù)組是很常用的方法,博主廢話也不多說了跃闹,對于這兩個方法的區(qū)別博主詳細(xì)的給大家講解一下G断鳌!望艺!
1苛秕、定義區(qū)別
forEach()?方法對數(shù)組的每個元素執(zhí)行一次給定的函數(shù)。
const?? list = ['orange',?'banana',?'apple']
list.forEach(item => console.log(item))
打印結(jié)果: 'orange',?'banana',?'apple'
map()?方法創(chuàng)建一個新數(shù)組找默,其結(jié)果是該數(shù)組中的每個元素是調(diào)用一次提供的函數(shù)后的返回值艇劫。
const list = [1,3,4,5]
let map = list.map(item => item*2)
console.log(map)
打印結(jié)果: [2,6,8,10]
注意:forEach()沒有返回值并且不可以鏈?zhǔn)秸{(diào)用懂拾。
? ? ? ? ? ?map()有返回值麦备,不會改變原數(shù)組,?但是可以在?callback?執(zhí)行時改變原數(shù)組抄瑟。
2咧欣、forEach()方法是否可以改變原數(shù)組的問題
(1)可以改變原數(shù)組
const??? list= [? ?{id:?1,?age:?22},? ? ? ?{id:?2,?age:?32},? ? ? ?{id:?3,?age:?25},? ? ? ?{id:?4,?age:?14},? ? ? ?{id:?5,?age:?12},? ? ? ?{id:?6,?age:?30}? ? ?]
list.forEach((item,index) => {
? ? ?if (item.id === 1) {
? ? ? ? item.age = 28
? ? }
? })
打印結(jié)果為: ?[? ?{id:?1,?age:?28},? ? ? ?{id:?2,?age:?32},? ? ? ?{id:?3,?age:?25},? ? ? ?{id:?4,?age:?14},? ? ? ?{id:?5,?age:?12},? ? ? ?{id:?6,?age:?30}? ? ?]
(2)不可以改變原數(shù)組
const????list=?[? ?{id:?1,?age:?22},? ? ? ?{id:?2,?age:?32},? ? ? ?{id:?3,?age:?25},? ? ? ?{id:?4,?age:?14},? ? ? ?{id:?5,?age:?12},? ? ? ?{id:?6,?age:?30}? ? ?]
list.forEach((item, index) => {
? ? ? if (item.id === 1) {
? ? ? ? item={ id: 7, age: 18 }
? ? ?}
? })
打印結(jié)果為:??[? ?{id:?1,?age:?22},? ? ? ?{id:?2,?age:?32},? ? ? ?{id:?3,?age:?25},? ? ? ?{id:?4,?age:?14},? ? ? ?{id:?5,?age:?12},? ? ? ?{id:?6,?age:?30}? ? ?]
寫到這里大家可能會有疑問這是為什么呢?
首先需要了解下數(shù)據(jù)的類型以及堆內(nèi)存和棧內(nèi)存的概念:
(1)基本數(shù)據(jù)類型:Number? String Null? Boolean等轨帜,它們的變量名和值以及對象的引用變量都會存儲在棧內(nèi)存
(2)引用數(shù)據(jù)類型:Funtion? Object魄咕,對于這些復(fù)雜的數(shù)據(jù)類型都是存在堆內(nèi)存
對于堆內(nèi)存和棧內(nèi)存這里就先不展開敘述了。說到這里想必大家應(yīng)該理解了吧蚌父!其實(shí)從上述兩個案例中不難看出一個是改變對象里的屬性值(即簡單數(shù)據(jù)類型)哮兰,另一個是改變整個對象(即引用數(shù)據(jù)類型)。對于這個問題博主就說到這里苟弛,大家如有任何疑問及時給我留言喝滞。
3、使用場景
(1)forEach()方法適合于你并不打算改變數(shù)據(jù)的時候膏秫,而只是想用數(shù)據(jù)做一些事情 – 比如存入數(shù)據(jù)庫或則打印出來右遭。
(2) map()適用于你要改變數(shù)據(jù)值的時候。此方法返回一個新數(shù)組,并且還可以使用復(fù)合(composition)(map(), filter(), reduce()等組合使? ? ? ? ? ? ? 用)來玩出更多的花樣窘哈。
4吹榴、forEach()的注意事項
1、 除了拋出異常以外滚婉,沒有辦法中止或跳出?forEach()?循環(huán)图筹。如果你需要中止或跳出循環(huán),可以使用以下幾個方法:? ? ? ? ? ? ? ? ? ? ? ? ? ?Array.prototype.every(), Array.prototype.some(), Array.prototype.find()等方法让腹。
2远剩、 為了在控制臺中顯示數(shù)組的內(nèi)容,你可以使用?console.table()?來展示經(jīng)過格式化的數(shù)組骇窍。
3瓜晤、 如果使用箭頭函數(shù)表達(dá)式來傳入函數(shù)參數(shù),?thisArg?參數(shù)會被忽略像鸡,因?yàn)榧^函數(shù)在詞法上綁定了?this?值活鹰。
總結(jié)
(1)forEach()方法沒有返回值且不可以鏈?zhǔn)秸{(diào)用,map()返回一個新數(shù)組只估。
(2)對于forEach()能否改變原數(shù)組的問題繼續(xù)深究(大家對于此問題如有什么想法可以留言共同探討)志群。
(3)這兩個方法在執(zhí)行速度上有待考究。(查閱資料說法不一)蛔钙。