自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開發(fā) 前端
JavaScript中一些最受歡迎的功能可能是map和forEach。從ECMAScript 5(簡稱es5)開始,它們就開始存在了。在本文中,我將討論它們之間的主要區(qū)別,并向你展示其用法的一些示例。

JavaScript中一些最受歡迎的功能可能是map和forEach。從ECMAScript 5(簡稱es5)開始,它們就開始存在了。

在本文中,我將討論它們之間的主要區(qū)別,并向你展示其用法的一些示例。

閱讀之前

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

[[335961]]

什么是map()和forEach()?

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

  1. var array = ['1', '2', '3']; 
  2. for (var i = 0; i < array.length; i += 1) { 
  3.   console.log(Number(array[i])); 
  4. // 1 
  5. // 2 
  6. // 3 

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

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

map

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

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

  1. const arr = ['1', '2', '3']; 
  2. // 回調函數接受3個參數 
  3. // 數組的當前值作為第一個參數 
  4. // 當前值在數組中的位置作為第二個參數 
  5. // 原始源數組作為第三個參數 
  6. const cb = (str, i, origin) => { 
  7.   console.log(`${i}: ${Number(str)} / ${origin}`); 
  8. }; 
  9. arr.map(cb); 
  10. // 0: 1 / 1,2,3 
  11. // 1: 2 / 1,2,3 
  12. // 2: 3 / 1,2,3 

回調函數可以如下使用。

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

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

  1. const arr = [1]; 
  2. const new_arr = arr.map(d => d); 
  3.  
  4. arr === new_arr; // false 

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

  1. const obj = { name: 'Jane' }; 
  2.  
  3. [1].map(function() { 
  4.   // { name: 'Jane' } 
  5.   console.dir(this); 
  6. }, obj); 
  7.  
  8. [1].map(() => { 
  9.   // window 
  10.   console.dir(this); 
  11. }, obj); 

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

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

forEach

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

  1. const arr = ['1', '2', '3']; 
  2. // 回調函數接受3個參數 
  3. // 數組的當前值作為第一個參數 
  4. // 當前值在數組中的位置作為第二個參數 
  5. // 原始源數組作為第三個參數 
  6. const cb = (str, i, origin) => { 
  7.   console.log(`${i}: ${Number(str)} / ${origin}`); 
  8. }; 
  9. arr.forEach(cb); 
  10. // 0: 1 / 1,2,3 
  11. // 1: 2 / 1,2,3 
  12. // 2: 3 / 1,2,3 

那有什么不同?

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

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

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

  1. [{a: 1, b: 2}, {a: 10, b: 20}].forEach((obj) => obj.a += 1); 
  2. // [{a: 2, b: 2}, {a: 11, b: 21}] 
  3. // 數組已更改! 

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

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

這是一個簡單的例子。

  1. const people = [ 
  2.   { name: 'Josh', whatCanDo: 'painting' }, 
  3.   { name: 'Lay', whatCanDo: 'security' }, 
  4.   { name: 'Ralph', whatCanDo: 'cleaning' } 
  5. ]; 
  6.  
  7. function makeWorkers(people) { 
  8.   return people.map((person) => { 
  9.     const { name, whatCanDo } = person; 
  10.     return <li key={name}>My name is {name}, I can do {whatCanDo}</li> 
  11.   }); 
  12.  
  13. <ul>makeWorkers(people)</ul> 

 

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

  1. const mySubjectId = ['154', '773', '245']; 
  2.  
  3. function countSubjects(subjects) { 
  4.   let cnt = 0
  5.    
  6.   subjects.forEach(subject => { 
  7.     if (mySubjectId.includes(subject.id)) { 
  8.       cnt += 1; 
  9.     } 
  10.   }); 
  11.    
  12.   return cnt; 
  13.  
  14. countSubjects([ 
  15.   { id: '223', teacher: 'Mark' }, 
  16.   { id: '154', teacher: 'Linda' } 
  17. ]); 
  18. // 1 

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

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

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

速度比較

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

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

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

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

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

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2022-08-31 08:33:54

Bash操作系統(tǒng)Linux

2020-12-22 14:11:45

JS forEach()map()

2023-10-27 15:31:04

For循環(huán)Foreach循環(huán)

2025-04-27 08:15:00

FlinkSavepointCheckpoint

2022-09-02 09:02:44

TypeInterface

2021-03-27 10:56:17

promisethenfinally

2024-05-06 10:55:38

2023-10-27 08:23:10

CookieWeb存儲

2023-11-14 14:13:52

SQLNoSQLCAP

2021-12-17 14:40:02

while(1)for(;;)語言

2024-03-05 18:59:59

前端開發(fā)localhost

2022-08-02 08:23:37

SessionCookies

2024-05-27 00:40:00

2022-02-27 15:33:22

安全CASBSASE

2024-09-09 13:10:14

2021-05-16 14:26:08

RPAIPACIO

2023-11-01 08:08:47

PythonIS運算符

2022-12-14 17:26:43

2020-03-09 20:56:19

LoRaLoRaWAN無線技術

2022-09-07 18:32:57

并發(fā)編程線程
點贊
收藏

51CTO技術棧公眾號