92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

JavaScript中的map()和forEach()有什么區別?

2020-7-4    seo達人

閱讀之前

基本上,在JavaScript中遍歷對象取決于對象是否可迭代。默認情況下,數組是可迭代的。map 和 forEach 包含在Array.prototype 中,因此我們無需考慮可迭代性。如果你想進一步學習,我推薦你看看什么是JavaScript中的可迭代對象!


什么是map()和forEach()?

map 和 forEach 是數組中的幫助器方法,可以輕松地在數組上循環。我們曾經像下面這樣循環遍歷一個數組,沒有任何輔助函數。


var array = ['1', '2', '3'];

for (var i = 0; i < array.length; i += 1) {

 console.log(Number(array[i]));

}

// 1

// 2

// 3

自JavaScript時代開始以來,就一直存在 for 循環。它包含3個表達式:初始值,條件和最終表達式。


這是循環數組的經典方法。從ECMAScript 5開始,新功能似乎使我們更加快樂。


map

map 的作用與 for 循環完全相同,只是 map 會創建一個新數組,其結果是在調用數組中的每個元素上調用提供的函數。


它需要兩個參數:一個是稍后在調用 map 或 forEach 時調用的回調函數,另一個是回調函數被調用時使用的名為 thisArg 的上下文變量。


const arr = ['1', '2', '3'];

// 回調函數接受3個參數

// 數組的當前值作為第一個參數

// 當前值在數組中的位置作為第二個參數

// 原始源數組作為第三個參數

const cb = (str, i, origin) => {

 console.log(`${i}: ${Number(str)} / ${origin}`);

};

arr.map(cb);

// 0: 1 / 1,2,3

// 1: 2 / 1,2,3

// 2: 3 / 1,2,3

回調函數可以如下使用。


arr.map((str) => { console.log(Number(str)); })

map 的結果不等于原始數組。


const arr = [1];

const new_arr = arr.map(d => d);


arr === new_arr; // false

你還可以將對象作為 thisArg 傳遞到map。


const obj = { name: 'Jane' };


[1].map(function() {

 // { name: 'Jane' }

 console.dir(this);

}, obj);


[1].map(() => {

 // window

 console.dir(this);

}, obj);

對象 obj 成為 map 的 thisArg。但是箭頭回調函數無法將 obj 作為其 thisArg。


這是因為箭頭函數與正常函數不同。


forEach

forEach 是數組的另一個循環函數,但 map 和 forEach 在使用中有所不同。map 和 forEach 可以使用兩個參數——回調函數和 thisArg,它們用作其 this。


const arr = ['1', '2', '3'];

// 回調函數接受3個參數

// 數組的當前值作為第一個參數

// 當前值在數組中的位置作為第二個參數

// 原始源數組作為第三個參數

const cb = (str, i, origin) => {

 console.log(`${i}: ${Number(str)} / ${origin}`);

};

arr.forEach(cb);

// 0: 1 / 1,2,3

// 1: 2 / 1,2,3

// 2: 3 / 1,2,3

那有什么不同?


map 返回其原始數組的新數組,但是 forEach 卻沒有。但是它們都確保了原始對象的不變性。


[1,2,3].map(d => d + 1); // [2, 3, 4];

[1,2,3].forEach(d => d + 1); // undefined;

如果更改數組內的值,forEach 不能確保數組的不變性。這個方法只有在你不接觸里面的任何值時,才能保證不變性。


[{a: 1, b: 2}, {a: 10, b: 20}].forEach((obj) => obj.a += 1);

// [{a: 2, b: 2}, {a: 11, b: 21}]

// 數組已更改!

何時使用map()和forEach()?

由于它們之間的主要區別在于是否有返回值,所以你會希望使用 map 來制作一個新的數組,而使用 forEach 只是為了映射到數組上。


這是一個簡單的例子。


const people = [

 { name: 'Josh', whatCanDo: 'painting' },

 { name: 'Lay', whatCanDo: 'security' },

 { name: 'Ralph', whatCanDo: 'cleaning' }

];


function makeWorkers(people) {

 return people.map((person) => {

   const { name, whatCanDo } = person;

   return <li key={name}>My name is {name}, I can do {whatCanDo}</li>

 });

}


<ul>makeWorkers(people)</ul>

比如在React中,map 是非常常用的制作元素的方法,因為 map 在對原數組的數據進行操作后,會創建并返回一個新的數組。


const mySubjectId = ['154', '773', '245'];


function countSubjects(subjects) {

 let cnt = 0;

 

 subjects.forEach(subject => {

   if (mySubjectId.includes(subject.id)) {

     cnt += 1;

   }

 });

 

 return cnt;

}


countSubjects([

 { id: '223', teacher: 'Mark' },

 { id: '154', teacher: 'Linda' }

]);

// 1

另一方面,當你想對數據進行某些操作而不創建新數組時,forEach 很有用。順便說一句,可以使用 filter 重構示例。


subjects.filter(subject => mySubjectId.includes(subject.id)).length;

綜上所述,我建議你在創建一個新的數組時使用map,當你不需要制作一個新的數組,而是要對數據做一些事情時,就使用forEach。


速度比較

有些帖子提到 map 比 forEach 快。所以,我很好奇這是不是真的。我找到了這個對比結果。






該代碼看起來非常相似,但結果卻相反。有些測試說 forEach 更快,有些說 map 更快。也許你在告訴自己 map/forEach 比其他的快,你可能是對的。老實說,我不確定。我認為在現代Web開發中,可讀性比 map 和 forEach 之間的速度重要得多。


但可以肯定的是——兩者都比JavaScript內置的 for 循環慢。

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務




日歷

鏈接

個人資料

藍藍設計的小編 http://m.skdbbs.com

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
国产极品一区| 尤物av一区二区| 在线观看亚洲a| 成人小视频免费在线观看| 岛国毛片av在线| 成人在线视频一区二区| 99热这里只有精品8| 亚洲欧美国产日韩中文字幕| 国产欧美啪啪| 日本久久一区二区三区| 日韩电影二区| 91在线中文字幕| 污污的视频在线观看| 欧美日韩精品免费在线观看视频| 国产不卡视频在线| 国产高清视频在线播放| 伊人春色之综合网| 亚洲v日韩v综合v精品v| 中文字幕亚洲一区在线观看| 亚洲精品一区二区三区影院| 国产自产精品| 91精品久久久久久久久99蜜臂| 999国产精品| 成人区精品一区二区| 日本一区二区在线免费播放| 亚洲大片精品永久免费| 清纯唯美亚洲经典中文字幕| 91久久精品美女高潮| 欧美野外猛男的大粗鳮| 国产一区二区美女视频| 成人免费直播live| 欧美成人日本| 色的视频在线免费看| 丰满放荡岳乱妇91ww| 爽爽淫人综合网网站| 久久中文字幕在线| aaa日本高清在线播放免费观看| 国产精品福利一区二区三区| 日韩女同互慰一区二区| 精品国产a毛片| 欧美日韩亚洲另类| 欧美高清视频在线播放| 综合自拍亚洲综合图不卡区| 亚洲第一福利视频| 成人午夜又粗又硬又大| 欧美sm极限捆绑bd| 国产精品视频色| 国产一区二区主播在线| 欧美性猛交xxxx乱大交| av网站在线看| 三区四区在线视频| www.日韩视频| 亚洲精品一区中文字幕乱码| 久久国产精品99久久久久久丝袜| 大美女一区二区三区| 欧亚一区二区三区| 亚洲国产一区二区在线播放| 久久久久中文字幕2018| 成人福利在线| 欧洲激情综合| 粉嫩av一区二区三区免费观看| 免费h在线看| 国产69久久精品成人| 国产精品福利av| 色噜噜狠狠狠综合曰曰曰88av| av电影在线网| 欧美色图一区| 精品国内产的精品视频在线观看| 国产精品美女久久久久久2018| 久久成人综合| 日韩有码在线视频| 亚洲高清视频一区二区| 久久亚洲综合网| 欧美不卡激情三级在线观看| 欧美嫩在线观看| 国产农村妇女精品一二区| 超碰日本道色综合久久综合| 午夜一区二区三视频在线观看| 夜夜嗨av色一区二区不卡| 国产一区在线免费| 亚洲欧美资源在线| 国产自产在线视频一区| 色婷婷av一区二区三区丝袜美腿| 久久亚洲二区三区| 久久五月天小说| 亚洲成人一区| 午夜在线观看免费一区| 激情综合自拍| 91大神福利视频在线| av日韩国产| 成人黄色免费看| 福利视频亚洲| 精品久久久久久久久久岛国gif| 精品亚洲成a人在线观看| 国产一区不卡在线观看| 第四色中文综合网| 久久成人精品一区二区三区| 欧美自拍大量在线观看| 国产精品av一区二区三区| 欧美三级精品| 视频一区欧美日韩| 韩国理伦片一区二区三区在线播放| 中文字幕国产精品| 久久久精品2019中文字幕神马| 亚洲国产精品久久不卡毛片| 欧美96一区二区免费视频| 在线亚洲精品福利网址导航| 日韩在线观看一区二区三区| 久久蜜桃av一区精品变态类天堂| 今天的高清视频免费播放成人| 高清不卡在线观看av| 亚洲第一精品电影| 国产亚洲精品aa| 日韩亚洲精品电影| 亚洲国产精品一区二区尤物区| 91精品婷婷国产综合久久竹菊| 成人永久免费| 成人精品一区二区三区免费| 伊人精品成人久久综合软件| 精品久久久网| 66精品视频在线观看| 亚洲精品一卡二卡三卡四卡| 97在线精品国自产拍中文| 日韩精品欧美精品| 99久久99久久精品免费观看| 久久精品人人爽人人爽| 久久综合伊人77777尤物| 一区二区三区在线免费播放| 日韩极品在线观看| 在线日韩一区| 亚洲狠狠婷婷| 欧美成人一区二区三区在线观看| 国产精品久久久久久久第一福利| 在线观看a级片| 欧美综合二区| 精品视频在线观看免费观看| 欧美国产精品中文字幕| 18久久久久久| 国产高清精品二区| 日韩精品在线视频| 欧美大片大片在线播放| 成人福利视频在线观看| www.av在线播放| 日本在线高清| 国产一区二区剧情av在线| 91高清在线视频| 日韩午夜在线电影| 91麻豆国产语对白在线观看| 亚洲春色在线| 91久久视频| 在线日韩三级| 成人毛片av在线| 国产日韩欧美91| 欧美**vk| 五月天网站亚洲| 91亚洲永久精品| 欧洲日本亚洲国产区| 日韩欧美亚洲区| 午夜精品久久久| 日韩精品免费视频一区二区三区| 麻豆传媒在线免费| 青娱乐精品在线视频| 视频一区二区综合| 欧美在线视频一二三|