偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

JavaScript中一些最受歡迎的功能可能是map和forEach。從ECMAScript 5(簡(jiǎn)稱(chēng)es5)開(kāi)始,它們就開(kāi)始存在了。

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

閱讀之前

基本上,在JavaScript中遍歷對(duì)象取決于對(duì)象是否可迭代。默認(rèn)情況下,數(shù)組是可迭代的。map 和 forEach 包含在 Array.prototype 中,因此我們無(wú)需考慮可迭代性。如果你想進(jìn)一步學(xué)習(xí),我推薦你看看什么是JavaScript中的可迭代對(duì)象!

[[335961]]

什么是map()和forEach()?

map 和 forEach 是數(shù)組中的幫助器方法,可以輕松地在數(shù)組上循環(huán)。我們?cè)?jīng)像下面這樣循環(huán)遍歷一個(gè)數(shù)組,沒(méi)有任何輔助函數(shù)。

  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時(shí)代開(kāi)始以來(lái),就一直存在 for 循環(huán)。它包含3個(gè)表達(dá)式:初始值,條件和最終表達(dá)式。

這是循環(huán)數(shù)組的經(jīng)典方法。從ECMAScript 5開(kāi)始,新功能似乎使我們更加快樂(lè)。

map

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

它需要兩個(gè)參數(shù):一個(gè)是稍后在調(diào)用 map 或 forEach 時(shí)調(diào)用的回調(diào)函數(shù),另一個(gè)是回調(diào)函數(shù)被調(diào)用時(shí)使用的名為 thisArg 的上下文變量。

  1. const arr = ['1', '2', '3']; 
  2. // 回調(diào)函數(shù)接受3個(gè)參數(shù) 
  3. // 數(shù)組的當(dāng)前值作為第一個(gè)參數(shù) 
  4. // 當(dāng)前值在數(shù)組中的位置作為第二個(gè)參數(shù) 
  5. // 原始源數(shù)組作為第三個(gè)參數(shù) 
  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 

回調(diào)函數(shù)可以如下使用。

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

map 的結(jié)果不等于原始數(shù)組。

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

你還可以將對(duì)象作為 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); 

對(duì)象 obj 成為 map 的 thisArg。但是箭頭回調(diào)函數(shù)無(wú)法將 obj 作為其 thisArg。

這是因?yàn)榧^函數(shù)與正常函數(shù)不同。

forEach

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

  1. const arr = ['1', '2', '3']; 
  2. // 回調(diào)函數(shù)接受3個(gè)參數(shù) 
  3. // 數(shù)組的當(dāng)前值作為第一個(gè)參數(shù) 
  4. // 當(dāng)前值在數(shù)組中的位置作為第二個(gè)參數(shù) 
  5. // 原始源數(shù)組作為第三個(gè)參數(shù) 
  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 返回其原始數(shù)組的新數(shù)組,但是 forEach 卻沒(méi)有。但是它們都確保了原始對(duì)象的不變性。

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

如果更改數(shù)組內(nèi)的值,forEach 不能確保數(shù)組的不變性。這個(gè)方法只有在你不接觸里面的任何值時(shí),才能保證不變性。

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

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

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

這是一個(gè)簡(jiǎn)單的例子。

  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 是非常常用的制作元素的方法,因?yàn)?map 在對(duì)原數(shù)組的數(shù)據(jù)進(jìn)行操作后,會(huì)創(chuàng)建并返回一個(gè)新的數(shù)組。

  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 

另一方面,當(dāng)你想對(duì)數(shù)據(jù)進(jìn)行某些操作而不創(chuàng)建新數(shù)組時(shí),forEach 很有用。順便說(shuō)一句,可以使用 filter 重構(gòu)示例。

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

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

速度比較

有些帖子提到 map 比 forEach 快。所以,我很好奇這是不是真的。我找到了這個(gè)對(duì)比結(jié)果。

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

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

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

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

 

責(zé)任編輯:趙寧寧 來(lái)源: 今日頭條
相關(guā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

2021-03-27 10:56:17

promisethenfinally

2022-09-02 09:02:44

TypeInterface

2024-05-06 10:55:38

2021-05-16 14:26:08

RPAIPACIO

2024-05-27 00:40:00

2021-12-17 14:40:02

while(1)for(;;)語(yǔ)言

2022-08-02 08:23:37

SessionCookies

2022-02-27 15:33:22

安全CASBSASE

2024-09-09 13:10:14

2024-03-05 18:59:59

前端開(kāi)發(fā)localhost

2023-11-14 14:13:52

SQLNoSQLCAP

2023-10-27 08:23:10

CookieWeb存儲(chǔ)

2022-12-14 17:26:43

2023-11-01 08:08:47

PythonIS運(yùn)算符

2022-09-07 18:32:57

并發(fā)編程線程

2020-03-09 20:56:19

LoRaLoRaWAN無(wú)線技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)