最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS中forEach()和map()的區(qū)別講解

 更新時間:2024年02月23日 15:17:33   作者:天下1281  
forEach和map方法都是基于數(shù)組的迭代器實現(xiàn)的,它們的主要區(qū)別在于對回調(diào)函數(shù)的處理方式,這篇文章主要介紹了JS中forEach()和map()的區(qū)別,需要的朋友可以參考下

forEach()和map()的區(qū)別

相同點:

  • 都是循環(huán)遍歷數(shù)組中的每一項
  • forEach和map方法里每次執(zhí)行匿名函數(shù)都支持3個參數(shù),參數(shù)分別是item(當(dāng)前每一項)、index(索引值)、arr(原數(shù)組)
  • 匿名函數(shù)中的this都是指向window
  • 只能遍歷數(shù)組

接下來我們看看這兩個方法

1.map()方法

map定義和用法:
map方法返回一個新的數(shù)組,數(shù)組中的元素為原始數(shù)組調(diào)用函數(shù)處理后的值。
我的理解就是:原數(shù)組進行處理之后對應(yīng)的一個新的數(shù)組。
map()方法按照原始數(shù)組元素順序依次處理元素。
注意:map()方法不會對空數(shù)組進行檢測。
map()方法不會改變原始數(shù)組。
瀏覽器支持:
chrome、safari、opera都支持
IE:>=9版本
safari: >=1.5
語法:

array.map(function(item,index,arr){},thisValue)

參數(shù)說明:
item 當(dāng)前元素的值
index 索引值
arr 原數(shù)組
舉個小例子

var arr = [0,2,4,6,8];
var str = arr.map(function(item,index,arr){
    console.log(this);
    console.log("原數(shù)組arr:",arr); //注意這里執(zhí)行5次
    return item / 2;
},this);
console.log(str);

執(zhí)行的結(jié)果如下:
[0,1,2,3,4,5]

2.forEach

定義和用法
forEach()方法用于調(diào)用數(shù)組的每個元素,將元素傳給回調(diào)函數(shù)。
注意:forEach對于空數(shù)組是不會調(diào)用回調(diào)函數(shù)的。
語法:

Array.forEach(function(item,index,arr){},this)

參數(shù)說明同map方法
代碼實例如下:

var sum = 0;
var str = arr.forEach(function(item,index,arr){
    sum += item;
    console.log("sum的值為:",sum); //0 2 6 12 20 
})

補充:

forEach和map詳細(xì)講解

forEach和map 基本用法forEachmap 剖析原理forEachmap 總結(jié)

基本用法

forEachmap都是JavaScript中常見的用于遍歷數(shù)組的方法,它們都可以用于對數(shù)組中的每個元素執(zhí)行某種操作,但它們的使用方式和返回結(jié)果略有不同。

forEach

forEach是一個用于數(shù)組的方法,它會對數(shù)組中的每個元素執(zhí)行一次回調(diào)函數(shù)。該方法沒有返回值,它只是遍歷整個數(shù)組并執(zhí)行回調(diào)函數(shù)。

forEach方法的語法如下:

array.forEach(callback(currentValue, index, array), thisArg);

其中,callback是要執(zhí)行的函數(shù),它會被傳入三個參數(shù):

  • currentValue:當(dāng)前處理的元素。
  • index:當(dāng)前處理元素的索引。
  • array:當(dāng)前正在遍歷的數(shù)組。

thisArg是一個可選參數(shù),用于指定執(zhí)行回調(diào)函數(shù)時使用的 this 值。

forEach方法返回的是undefined,它不會生成新的數(shù)組。

forEach方法和for循環(huán)在功能上類似,但它更簡潔、易讀,也更安全,因為它會避免循環(huán)時的一些常見問題,如數(shù)組越界、重復(fù)計算等。

下面是一個使用 forEach 方法遍歷數(shù)組并輸出每個元素的例子:

const arr = [1, 2, 3];
arr.forEach((element) => {
  console.log(element);
});

map

map 方法也是一個用于數(shù)組的方法,它會對數(shù)組中的每個元素執(zhí)行一次回調(diào)函數(shù),并將回調(diào)函數(shù)的返回值存儲在一個新的數(shù)組中。

map 方法的語法如下:

array.map(callback(currentValue, index, array), thisArg);

其中,callback 是要執(zhí)行的函數(shù),它會被傳入三個參數(shù):

  • currentValue:當(dāng)前處理的元素。
  • index:當(dāng)前處理元素的索引。
  • array:當(dāng)前正在遍歷的數(shù)組。

thisArg是一個可選參數(shù),用于指定執(zhí)行回調(diào)函數(shù)時使用的 this 值。

map 方法會返回一個新的數(shù)組,這個數(shù)組的長度和原數(shù)組相同,但是每個元素都是經(jīng)過回調(diào)函數(shù)處理后的結(jié)果。

下面是一個使用 map 方法將數(shù)組中的每個元素都加上 1 的例子:

const arr = [1, 2, 3];
const newArr = arr.map((element) => {
  return element + 1;
});
console.log(newArr); // 輸出[2, 3, 4]

可以看到,map 方法生成了一個新的數(shù)組,并將原數(shù)組中的每個元素都加上了 1。

剖析原理

forEachmap方法的原理都是基于數(shù)組的迭代器,實際上它們都是通過調(diào)用迭代器實現(xiàn)對數(shù)組的遍歷。

JavaScript數(shù)組有一個內(nèi)置的迭代器,即Array.prototype[@@iterator]方法。該方法返回一個迭代器對象,可以使用該對象對數(shù)組進行迭代。forEachmap方法都會調(diào)用Array.prototype[@@iterator]方法返回迭代器對象,然后使用該迭代器對象進行遍歷。

forEach

當(dāng)調(diào)用forEach方法時,JavaScript引擎會執(zhí)行以下步驟:

  • 檢查數(shù)組是否存在,如果不存在,則拋出TypeError異常。
  • 檢查第一個參數(shù)是否是一個函數(shù),如果不是,則拋出TypeError異常。
  • 檢查第二個參數(shù)是否是一個對象,如果是,則將該對象作為this值傳遞給回調(diào)函數(shù),否則this值為undefined。
  • 獲取迭代器對象,通過調(diào)用Array.prototype[@@iterator]方法獲得。
  • 對于迭代器對象中的每個元素,依次執(zhí)行回調(diào)函數(shù),并將當(dāng)前元素的值、索引和原數(shù)組作為參數(shù)傳遞給回調(diào)函數(shù)。
  • forEach方法不會返回任何值。

下面是一個簡化的forEach實現(xiàn)代碼:

Array.prototype.myForEach = function(callback, thisArg) {
  if (typeof callback !== 'function') {
    throw new TypeError(callback + ' is not a function');
  }
  for (var i = 0; i < this.length; i++) {
    callback.call(thisArg, this[i], i, this);
  }
};

可以看到,該實現(xiàn)代碼使用了for循環(huán)來遍歷數(shù)組,并使用call方法調(diào)用回調(diào)函數(shù),并將當(dāng)前元素的值、索引和原數(shù)組作為參數(shù)傳遞給回調(diào)函數(shù)。

map

map方法的原理與forEach方法類似,也是通過調(diào)用迭代器實現(xiàn)對數(shù)組的遍歷,只不過map方法在遍歷時會將回調(diào)函數(shù)的返回值存儲在一個新的數(shù)組中。下面我們以map方法為例來剖析其原理。

當(dāng)調(diào)用map方法時,JavaScript引擎會執(zhí)行以下步驟:

  • 檢查數(shù)組是否存在,如果不存在,則拋出TypeError異常。
  • 檢查第一個參數(shù)是否是一個函數(shù),如果不是,則拋出TypeError異常。
  • 檢查第二個參數(shù)是否是一個對象,如果是,則將該對象作為this值傳遞給回調(diào)函數(shù),否則this值為undefined。
  • 創(chuàng)建一個新的空數(shù)組,用于存儲回調(diào)函數(shù)的返回值。
  • 獲取迭代器對象,通過調(diào)用Array.prototype[@@iterator]方法獲得。
  • 對于迭代器對象中的每個元素,依次執(zhí)行回調(diào)函數(shù),并將當(dāng)前元素的值、索引和原數(shù)組作為參數(shù)傳遞給回調(diào)函數(shù)。
  • 將回調(diào)函數(shù)的返回值存儲在新數(shù)組中。
  • 返回新數(shù)組。

下面是一個簡化的map實現(xiàn)代碼:

Array.prototype.myMap = function(callback, thisArg) {
  if (typeof callback !== 'function') {
    throw new TypeError(callback + ' is not a function');
  }
  var newArray = [];
  for (var i = 0; i < this.length; i++) {
    newArray.push(callback.call(thisArg, this[i], i, this));
  }
  return newArray;
};

可以看到,該實現(xiàn)代碼除了使用for循環(huán)遍歷數(shù)組之外,還創(chuàng)建了一個新的數(shù)組,并將回調(diào)函數(shù)的返回值存儲在新數(shù)組中,最后返回新數(shù)組。

總結(jié)

總的來說,forEachmap方法都是基于數(shù)組的迭代器實現(xiàn)的,它們的主要區(qū)別在于對回調(diào)函數(shù)的處理方式。forEach方法執(zhí)行回調(diào)函數(shù)時,不會將回調(diào)函數(shù)的返回值存儲起來,而是直接忽略。map方法執(zhí)行回調(diào)函數(shù)時,會將回調(diào)函數(shù)的返回值存儲在一個新數(shù)組中,最后將該數(shù)組返回。因此,如果我們需要對數(shù)組中的每個元素執(zhí)行一個操作,并將操作的結(jié)果存儲在新數(shù)組中,那么應(yīng)該使用map方法。如果我們只是需要對數(shù)組中的每個元素執(zhí)行一些操作,而不需要將操作的結(jié)果存儲起來,那么應(yīng)該使用forEach方法。

到此這篇關(guān)于JS中forEach()和map()的區(qū)別解析的文章就介紹到這了,更多相關(guān)forEach()和map()的區(qū)別:內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 微信小程序之裁剪圖片成圓形的實現(xiàn)代碼

    微信小程序之裁剪圖片成圓形的實現(xiàn)代碼

    最近在開發(fā)小程序,產(chǎn)品經(jīng)理提了一個需求,要求微信小程序換頭像,用戶剪裁圖片必須是圓形。這篇文章主要介紹了微信小程序之裁剪圖片成圓形 ,需要的朋友可以參考下
    2018-10-10
  • JS前端廣告攔截實現(xiàn)原理解析

    JS前端廣告攔截實現(xiàn)原理解析

    這篇文章主要介紹了JS前端廣告攔截實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • JavaScript中逗號運算符介紹及使用示例

    JavaScript中逗號運算符介紹及使用示例

    這篇文章主要介紹了JavaScript中逗號運算符介紹及使用示例,本文講解了逗號運算符的定義、使用例子及實際使用的一些技巧,需要的朋友可以參考下
    2015-03-03
  • JS創(chuàng)建對象的寫法示例

    JS創(chuàng)建對象的寫法示例

    這篇文章主要介紹了JS創(chuàng)建對象的寫法,結(jié)合實例形式分析了javascript對象的定義、實現(xiàn)方法與使用技巧,需要的朋友可以參考下
    2016-11-11
  • javascript實現(xiàn)獲取圖片大小及圖片等比縮放的方法

    javascript實現(xiàn)獲取圖片大小及圖片等比縮放的方法

    這篇文章主要介紹了javascript實現(xiàn)獲取圖片大小及圖片等比縮放的方法,涉及javascript針對圖形圖像相關(guān)屬性獲取與修改相關(guān)操作技巧,需要的朋友可以參考下
    2016-11-11
  • Bootstrap CSS布局之列表

    Bootstrap CSS布局之列表

    這篇文章主要為大家詳細(xì)介紹了Bootstrap CSS布局之列表的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • js 動態(tài)添加標(biāo)簽(新增一行,其實很簡單,就是幾個函數(shù)的應(yīng)用)

    js 動態(tài)添加標(biāo)簽(新增一行,其實很簡單,就是幾個函數(shù)的應(yīng)用)

    把所有代碼拷下另存為一個html文件,在瀏覽器中打開,點擊“新增一行”按鈕就可以,以下是對js函數(shù)的解釋
    2009-03-03
  • js性能優(yōu)化 如何更快速加載你的JavaScript頁面

    js性能優(yōu)化 如何更快速加載你的JavaScript頁面

    JavaScript現(xiàn)在極其重要。一些網(wǎng)站使用JavaScript來增添魅力;如今的許多Web應(yīng)用程序依賴它;其中一些甚至是完全用JavaScript編寫而成的。我在本文中將指出一些重要的規(guī)則,介紹如何使用你的JavaScript、使用哪些工具以及你將從中得到什么好處
    2012-03-03
  • JavaScript中三種觀察者實現(xiàn)案例分享

    JavaScript中三種觀察者實現(xiàn)案例分享

    前面突然看到 Object.defineProperty,就順道想到 Proxy,然后就想到了觀察者案例,這邊還沒有用 javascript編寫一個觀察者的案例呢,順道加入了一個 event-bus 監(jiān)聽事件案例,湊一起看一看不同的實現(xiàn)方式,需要的朋友可以參考下
    2023-08-08
  • 一文手把手教你如何使用JavaScript預(yù)加載圖片告別加載卡頓

    一文手把手教你如何使用JavaScript預(yù)加載圖片告別加載卡頓

    本文詳細(xì)介紹了圖片預(yù)加載的原理,優(yōu)勢和注意事項,包括圖片預(yù)加載的核心思路,預(yù)加載和懶加載的區(qū)別,如何實現(xiàn)JavaScript圖片預(yù)加載,以及預(yù)加載的隱藏成本和適用場景,需要的朋友可以參考下
    2026-01-01

最新評論

丰原市| 秦安县| 莒南县| 兴山县| 商河县| 阜城县| 辽源市| 衡阳县| 玉山县| 阳朔县| 汉阴县| 贵阳市| 海丰县| 阜南县| 探索| 大埔区| 巴中市| 吐鲁番市| 宁南县| 凤山县| 农安县| 金塔县| 上蔡县| 鹰潭市| 永德县| 通海县| 磐石市| 禹城市| 策勒县| 新田县| 四平市| 深圳市| 南安市| 汉沽区| 榆树市| 明光市| 乐平市| 青铜峡市| 静宁县| 沙田区| 陕西省|