欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JS面試題之forEach能否跳出循環(huán)詳解

 更新時間:2021年06月11日 14:39:26   作者:茶無味的一天  
js中經(jīng)常會使用foreach這個方法來遍歷數(shù)組,這篇文章主要給大家介紹了關(guān)于JS面試題之forEach能否跳出循環(huán)的相關(guān)資料,需要的朋友可以參考下

當(dāng)年懵懂無知的我被問到這個問題時,腦袋一片空白,當(dāng)然也沒答對,一直以來我對forEach都有一種錯誤的理解,由于它比原始的for循環(huán)簡潔許多,導(dǎo)致我一度認(rèn)為那是為了方便書寫所創(chuàng)造出來的語法糖,在業(yè)務(wù)中也經(jīng)常使用,但從沒考慮過這種方式存在的問題。

forEach使用說明

參考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach?v=example

arr.forEach(function callback(currentValue, index, array) {
    //your iterator
}[, thisArg]);
  • currentValue --- 當(dāng)前處理的元素
  • index --- 當(dāng)前處理元素的索引
  • array ---forEach應(yīng)用的數(shù)組

有一段提示寫到了在forEach中break和return的用法。原文如下:

There is no way to stop or break a forEach()loop other than by throwing an exception. If you need such behavior, theforEach()method is the wrong tool. Use a plain loop instead. If you are testing the array elements for a predicate and need a Boolean return value, you can useevery() or
some() instead. If available, the new methodsfind() or findIndex() can be used for early termination upon true predicates as well.

意思就是說在forEach中使用break和return是錯誤的,如果希望使用break或者return請使用every或者some函數(shù)。

那么回到標(biāo)題,首先forEach是不能使用任何手段跳出循環(huán)的,為什么呢?我們知道forEach接收一個函數(shù),它一般有兩個參數(shù),第一個是循環(huán)的當(dāng)前元素,第二個是該元素對應(yīng)的下標(biāo),我們手動實現(xiàn)一下:

Array.prototype.myForEach = function (fn) {
    for (let i = 0; i < this.length; i++) {
        fn(this[i], i, this);
    }
}

forEach是不是真的這么實現(xiàn)我無從考究,但是以上這個簡單的偽代碼確實滿足forEach的特性,而且也很明顯就是不能跳出循環(huán),因為你根本沒有辦法操作到真正的for循環(huán)體。

后來經(jīng)過查閱文檔,發(fā)現(xiàn)官方對forEach的定義根本不是我認(rèn)為的語法糖,它的標(biāo)準(zhǔn)說法是forEach為每個數(shù)組元素執(zhí)行一次你所提供的函數(shù)。到這里我的思路逐漸明朗,官方文檔也有這么一段話:

除拋出異常之外,沒有其他方法可以停止或中斷循環(huán)。如果您需要這種行為,則該forEach()方法是錯誤的工具。

使用拋出異常來跳出foreach循環(huán)

let arr = [0, 1, "stop", 3, 4];
try {
    arr.forEach(element => {
        if (element === "stop") {
            throw new Error("forEachBreak");
        }
        console.log(element); // 輸出 0 1 后面不輸出
    });
} catch (e) {
    console.log(e.message); // forEachBreak
};

當(dāng)然,使用try-catch包裹時,當(dāng)循環(huán)體過大性能會隨之下降,這是無法避免的,所以拋出異常并不是解決forEach問題的銀彈,我們回歸到開頭寫的那段偽代碼,我們對它進(jìn)行一些優(yōu)化,在真正的for循環(huán)中加入對傳入函數(shù)的判斷:

Array.prototype.forEach = function (fn) {
    for (let i = 0; i < this.length; i++) {
        let ret = fn(this[i], i, this);
        if (typeof ret !== "undefined" && (ret == null || ret == false)) break;
    }
}

這樣的話自然就能根據(jù)return值來進(jìn)行循環(huán)跳出啦:

let arr = [0, 1, "stop", 3, 4];

arr.forEach(element => {
    if (element === 'stop') return false
    console.log(element); // 輸出 0 1 后面不輸出
});

console.log('return即為continue:');
arr.forEach(element => {
    if (element === 'stop') return
    console.log(element); // 0 1 3 4
});

文檔中還提到forEach需要一個同步函數(shù),也就是說在使用異步函數(shù)或Promise作為回調(diào)時會發(fā)生預(yù)期以外的結(jié)果,所以forEach還是需要慎用或者不要使用,當(dāng)然這并不意味著項目開發(fā)中要一直用簡單的for循環(huán)去完成一切事情,我們可以在遍歷數(shù)組時使用for..of..,在遍歷對象時使用for..in..,而官方也在forEach文檔下列舉了其它一些工具函數(shù):

Array.prototype.find()
Array.prototype.findIndex()
Array.prototype.map()
Array.prototype.filter()
Array.prototype.every()
Array.prototype.some()

根據(jù)不同的業(yè)務(wù)場景,選擇使用對應(yīng)的工具函數(shù)來更有效地處理業(yè)務(wù)邏輯,至于forEach,我想就從此相忘于江湖吧。

總結(jié)

到此這篇關(guān)于JS面試題之forEach能否跳出循環(huán)的文章就介紹到這了,更多相關(guān)JS forEach跳出循環(huán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 前端如何利用CryptoJS實現(xiàn)數(shù)據(jù)信息的加密詳解

    前端如何利用CryptoJS實現(xiàn)數(shù)據(jù)信息的加密詳解

    這篇文章主要給大家介紹了關(guān)于前端如何利用CryptoJS實現(xiàn)數(shù)據(jù)信息加密的相關(guān)資料,前端解密解密工具Cryptojs提供了前端加密解密的工作,包括常用的MD5、BASE64、SHA1、AES等加密解密方法,需要的朋友可以參考下
    2023-11-11
  • js調(diào)試工具 Javascript Debug Toolkit 2.0.0版本發(fā)布

    js調(diào)試工具 Javascript Debug Toolkit 2.0.0版本發(fā)布

    Javascript Debug Toolkit是一個可以跨瀏覽器調(diào)試javascript的開源項目,支持在IE,FIREFOX,SAFARI,CHROME等瀏覽器中調(diào)試javascript。2.0.0版本做了較大變動,增加以下功能
    2008-12-12
  • javascript基本數(shù)據(jù)類型及類型檢測常用方法小結(jié)

    javascript基本數(shù)據(jù)類型及類型檢測常用方法小結(jié)

    這篇文章主要介紹了javascript基本數(shù)據(jù)類型及類型檢測常用方法,總結(jié)分析了javascript的基本數(shù)據(jù)類型與類型檢測的常用操作方法,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-12-12
  • JS+CSS實現(xiàn)彈出全屏灰黑色透明遮罩效果的方法

    JS+CSS實現(xiàn)彈出全屏灰黑色透明遮罩效果的方法

    這篇文章主要介紹了JS+CSS實現(xiàn)彈出全屏灰黑色透明遮罩效果的方法,詳細(xì)分析了彈出遮罩層效果的實現(xiàn)方法以及完整的實例代碼,需要的朋友可以參考下
    2014-12-12
  • 多種方法實現(xiàn)JS動態(tài)添加事件

    多種方法實現(xiàn)JS動態(tài)添加事件

    JS動態(tài)添加事件的方法有很多,我們可以使用setAttribute、attachEvent 和 addEventListener等等,感興趣的朋友可以參考下
    2013-11-11
  • JS組件Bootstrap dropdown組件擴(kuò)展hover事件

    JS組件Bootstrap dropdown組件擴(kuò)展hover事件

    bootstrap的下拉組件,需要點(diǎn)擊click時,方可展示下拉列表。因此對于喜歡簡單少操作的大家來說,點(diǎn)擊一下多少帶來不便,因此,引入hover監(jiān)聽,鼠標(biāo)經(jīng)過自動展示下拉框。這篇文章主要介紹了JS組件Bootstrap dropdown組件擴(kuò)展hover事件,感興趣的小伙伴們可以參考一下
    2016-04-04
  • 詳解uniapp頁面跳轉(zhuǎn)URL傳參大坑

    詳解uniapp頁面跳轉(zhuǎn)URL傳參大坑

    本文主要介紹了詳解uniapp頁面跳轉(zhuǎn)URL傳參大坑,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • JavaScript實現(xiàn)的鼠標(biāo)跟隨特效示例【2則實例】

    JavaScript實現(xiàn)的鼠標(biāo)跟隨特效示例【2則實例】

    這篇文章主要介紹了JavaScript實現(xiàn)的鼠標(biāo)跟隨特效,結(jié)合2則實例形式分析了javascript針對鼠標(biāo)事件的響應(yīng)、計算、處理及頁面元素動態(tài)操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2018-12-12
  • 一個加載js文件的小腳本

    一個加載js文件的小腳本

    一個加載js文件的小腳本...
    2007-06-06
  • element el-input 刪除邊框的實現(xiàn)

    element el-input 刪除邊框的實現(xiàn)

    本文主要介紹了element el-input 刪除邊框的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評論