真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

中斷forEach循環(huán)的方法

這篇文章將為大家詳細(xì)講解有關(guān)中斷forEach循環(huán)的方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

站在用戶的角度思考問題,與客戶深入溝通,找到黃陵網(wǎng)站設(shè)計與黃陵網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋黃陵地區(qū)。

在使用for循環(huán)的時候可以使用break 或者return語句來結(jié)束for循環(huán)(return直接結(jié)束函數(shù)),但是如果使用forEach循環(huán)如何跳出循環(huán)呢?

嘗試使用break 和return

首先嘗試一使用return語句----木有效果

[1,2,3,4,5].forEach(item=>{
    if(item===2){
    return
    }
    console.log(item);
})

MDN給出的官方解釋

為什么會出現(xiàn)這樣的情況?先看一下官方文檔的說明。
MDN文檔上明確說明forEach循環(huán)是不可以退出的。

引自MDN
There is no way to stop or break a forEach() loop other than by throwing an exception. If you need such behavior, the forEach() method is the wrong tool.
注意: 沒有辦法中止或者跳出 forEach() 循環(huán),除了拋出一個異常。如果你需要這樣,使用 forEach() 方法是錯誤的。
若你需要提前終止循環(huán),你可以使用:
簡單循環(huán)
for...of 循環(huán)
Array.prototype.every()
Array.prototype.some()
Array.prototype.find()
Array.prototype.findIndex()

探究為什么break和return不行

先看看為什么return沒有效果,break報錯,forEach的實現(xiàn)方式用代碼表示出來可以寫成如下的結(jié)構(gòu)

const arr = [1, 2, 3, 4, 5];
for (let i = 0; i < arr.length; i++) {
  const rs = (function(item) {
    console.log(item);
    if (item > 2) return false;
  })(arr[i])
}

使用return語句相當(dāng)于在每個自執(zhí)行函數(shù)中將返回值復(fù)制給rs,但是實際對整個函數(shù)并沒有影響。而使用break語句報錯是因為再JS的解釋器中break語句是不可以出現(xiàn)在函數(shù)體內(nèi)的。

如何變通跳出forEach循環(huán)

MDN官方推薦的方法

// every在碰到return false的時候,中止循環(huán)。some在碰到return ture的時候,中止循環(huán)。
var a = [1, 2, 3, 4, 5]
a.every(item=>{
    console.log(item); //輸出:1,2
    if (item === 2) {
        return false
    } else {
        return true
    }
})
var a = [1, 2, 3, 4, 5]
a.some(item=> {
    console.log(item); //輸出:1,2
    if (item === 2) {
        return true
    } else {
        return false
    }
})

其他方法

1.使用for循環(huán)或者for in 循環(huán)代替

2.使用throw拋出異常

try {
  [1, 2, 3, 4, 5].forEach(function(item) {
    if (item=== 2) throw item;
    console.log(item);
  });
} catch (e) {}

3.使用判斷跑空循環(huán)

var tag;
[1, 2, 3, 4, 5].forEach(function(item){
    if(!tag){
        console.log(item);
        if(item===2){
            tag=true;
        }
    }

這樣做有兩個問題,第一個問題,全局增加了一個tag變量,第二個問題,表面上看是終止了forEach循環(huán),但是實際上循環(huán)的次數(shù)并沒有改變,只是在不滿足條件的時候callback什么都沒執(zhí)行而已,先來解決第一個問題,如何刪除全局下新增的tag變量 。實際上forEach還有第二個參數(shù),表示callback的執(zhí)行上下文,也就是在callback里面this對應(yīng)的值。因此我們可以講上下文設(shè)置成空對象,這個對象自然沒有tag屬性,因此訪問this.tag的時候會得到undefined

[1, 2, 3, 4, 5].forEach(function(item){
    if(!this.tag){
        console.log(item);
        if(item===2){
            this.tag=true;
        }
    }
},{})

4.修改索引

var array=[1, 2, 3, 4, 5]
array.forEach(item=>{
  if (item == 2) {
    array = array.splice(0);
  }
  console.log(item);
})

講解:

forEach的執(zhí)行細(xì)節(jié)

1.遍歷的范圍在第一次執(zhí)行callback的時候就已經(jīng)確定,所以在執(zhí)行過程中去push內(nèi)容,并不會影響遍歷的次數(shù),這和for循環(huán)有很大區(qū)別,下面的兩個案例一個會造成死循環(huán)一個不會

var arr=[1,2,3,4,5]
//會造成死循環(huán)的代碼
for(var i=0;iarr.push('a'))

2.如果已經(jīng)存在的值被改變,則傳遞給 callback 的值是 forEach 遍歷到他們那一刻的值。

var arr=[1,2,3,4,5];
arr.forEach((item,index)=>{
    console.log(`time ${index}`)
    arr[index+1]=`${index}a`;
    console.log(item)
})

3.已刪除的項不會被遍歷到。如果已訪問的元素在迭代時被刪除了(例如使用 shift()),之后的元素將被跳過。

var arr=[1,2,3,4,5];
arr.forEach((item,index)=>{
    console.log(item)
    if(item===2){
        arr.length=index;
    }
})

在滿足條件的時候?qū)⒑竺娴闹到氐?,下次循環(huán)的時候照不到對應(yīng)的值,循環(huán)就結(jié)束了,但是這樣操作會破壞原始的數(shù)據(jù),因此我們可以使用一個小技巧,即將數(shù)組從0開始截斷,然后重新賦值給數(shù)組也就是array=array.splice(0)。

關(guān)于中斷forEach循環(huán)的方法就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


分享標(biāo)題:中斷forEach循環(huán)的方法
分享URL:http://weahome.cn/article/peipps.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部