您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關中斷forEach循環的方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
在使用for循環的時候可以使用break 或者return語句來結束for循環(return直接結束函數),但是如果使用forEach循環如何跳出循環呢?
嘗試使用break 和return
首先嘗試一使用return語句----木有效果
[1,2,3,4,5].forEach(item=>{ if(item===2){ return } console.log(item); })
MDN給出的官方解釋
為什么會出現這樣的情況?先看一下官方文檔的說明。
MDN文檔上明確說明forEach循環是不可以退出的。
引自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() 循環,除了拋出一個異常。如果你需要這樣,使用 forEach() 方法是錯誤的。
若你需要提前終止循環,你可以使用:
簡單循環
for...of 循環
Array.prototype.every()
Array.prototype.some()
Array.prototype.find()
Array.prototype.findIndex()
探究為什么break和return不行
先看看為什么return沒有效果,break報錯,forEach的實現方式用代碼表示出來可以寫成如下的結構
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語句相當于在每個自執行函數中將返回值復制給rs,但是實際對整個函數并沒有影響。而使用break語句報錯是因為再JS的解釋器中break語句是不可以出現在函數體內的。
如何變通跳出forEach循環
MDN官方推薦的方法
// every在碰到return false的時候,中止循環。some在碰到return ture的時候,中止循環。 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循環或者for in 循環代替
2.使用throw拋出異常
try { [1, 2, 3, 4, 5].forEach(function(item) { if (item=== 2) throw item; console.log(item); }); } catch (e) {}
3.使用判斷跑空循環
var tag; [1, 2, 3, 4, 5].forEach(function(item){ if(!tag){ console.log(item); if(item===2){ tag=true; } }
這樣做有兩個問題,第一個問題,全局增加了一個tag變量,第二個問題,表面上看是終止了forEach循環,但是實際上循環的次數并沒有改變,只是在不滿足條件的時候callback什么都沒執行而已,先來解決第一個問題,如何刪除全局下新增的tag變量 。實際上forEach還有第二個參數,表示callback的執行上下文,也就是在callback里面this對應的值。因此我們可以講上下文設置成空對象,這個對象自然沒有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的執行細節
1.遍歷的范圍在第一次執行callback的時候就已經確定,所以在執行過程中去push內容,并不會影響遍歷的次數,這和for循環有很大區別,下面的兩個案例一個會造成死循環一個不會
var arr=[1,2,3,4,5] //會造成死循環的代碼 for(var i=0;i<arr.length;i++){ arr.push('a') } //不會造成死循環 arr.forEach(item=>arr.push('a'))
2.如果已經存在的值被改變,則傳遞給 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; } })
在滿足條件的時候將后面的值截掉,下次循環的時候照不到對應的值,循環就結束了,但是這樣操作會破壞原始的數據,因此我們可以使用一個小技巧,即將數組從0開始截斷,然后重新賦值給數組也就是array=array.splice(0)。
關于中斷forEach循環的方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。