如題悉盆,日常開發(fā)上會經(jīng)常遇到需要循環(huán)判斷條件,根據(jù)業(yè)務(wù)情況使用跳過/中止循環(huán)。
最簡單的循環(huán)從For循環(huán)開始
var arr = ['ns','ps5','xbox','ps4','will'];
for (var i = 0; i <= arr.length; i++) {
//跳過當前循環(huán)(進入下一次循環(huán))
if ( i == 1) continue;
console.log(arr[i]);
//中止循環(huán)(循環(huán)結(jié)束)
if ( i == 3) break;
}
然而我們在項目中會使用其他循環(huán)的寫法(每次都用上面這種循環(huán)看著也不優(yōu)雅),那他們?nèi)绾螌崿F(xiàn)continue和break呢?
1.jQuery.each()
var arr = ['ns','ps5','xbox','ps4','will'];
$.each(arr, function (i, v) {
//跳過循環(huán)
if (i == 1) return true;
console.log(v);
//中止循環(huán)
if (i == 3) return false;
});
可以看出赴肚,執(zhí)行結(jié)果與題目開始的For循環(huán)結(jié)果是一樣的素跺,通過return true/false 實現(xiàn) continue/break。
2.Array.forEach()誉券,forEach有幾個要注意的地方指厌,可以自己通過測試驗證。
- 不支持continue和break的關(guān)鍵字踊跟,使用就報錯踩验。
- return/return false/return true,能實現(xiàn)continue的效果商玫,但不能實現(xiàn)break效果箕憾。
- forEach 本身無法跳出循環(huán),必須遍歷所有的數(shù)據(jù)才能結(jié)束拳昌。
解決方案:
2.1 通過 try catch 拋出異常的方式跳出循環(huán)
var arr = ['ns','ps5','xbox','ps4','will'];
try {
arr.forEach(function (item, index) {
//跳過當前循環(huán)(進入下一次循環(huán))
if ( index == 1) return;
console.log(item);
//滿足中止循環(huán)條件袭异,拋出異常
if (index == 3) {
throw new Error('中止循環(huán)')
}
})
} catch(e) {
//todo
}
2.2 使用Es5新增 some() 和 every()函數(shù)
- Array.some()
var arr = ['ns','ps5','xbox','ps4','will'];
var result = arr.some(function (item, index) {
console.log(item);
if (index == 3) return true
});
console.log(result) // true
循環(huán)只要其中一個條件return true,后續(xù)的循環(huán)也不會繼續(xù)執(zhí)行炬藤,從而達到中止循環(huán)效果御铃。
整個循環(huán)的結(jié)果為true,否則為false沈矿。
- Array.every()
var arr = ['ns','ps5','xbox','ps4','will'];
var result = arr.every(function (item, index) {
console.log(item);
if (index == 1) return false
return true
});
console.log(result) // false
循環(huán)只有遇到return true畅买,才會執(zhí)行下一次循環(huán);沒有return 或者 return false 细睡,后續(xù)的循環(huán)不會執(zhí)行,從而達到中止循環(huán)效果帝火。
整個循環(huán)的結(jié)果為false溜徙,否則為true。