如题,日常开发上会经常遇到需要循环判断条件,根据业务情况使用跳过/中止循环。
最简单的循环从For循环开始
var arr = ['ns','ps5','xbox','ps4','will'];
for (var i = 0; i <= arr.length; i++) {
//跳过当前循环(进入下一次循环)
if ( i == 1) continue;
console.log(arr[i]);
//中止循环(循环结束)
if ( i == 3) break;
}
然而我们在项目中会使用其他循环的写法(每次都用上面这种循环看着也不优雅),那他们如何实现continue和break呢?
1.jQuery.each()
var arr = ['ns','ps5','xbox','ps4','will'];
$.each(arr, function (i, v) {
//跳过循环
if (i == 1) return true;
console.log(v);
//中止循环
if (i == 3) return false;
});
可以看出,执行结果与题目开始的For循环结果是一样的,通过return true/false 实现 continue/break。
2.Array.forEach(),forEach有几个要注意的地方,可以自己通过测试验证。
- 不支持continue和break的关键字,使用就报错。
- return/return false/return true,能实现continue的效果,但不能实现break效果。
- forEach 本身无法跳出循环,必须遍历所有的数据才能结束。
解决方案:
2.1 通过 try catch 抛出异常的方式跳出循环
var arr = ['ns','ps5','xbox','ps4','will'];
try {
arr.forEach(function (item, index) {
//跳过当前循环(进入下一次循环)
if ( index == 1) return;
console.log(item);
//满足中止循环条件,抛出异常
if (index == 3) {
throw new Error('中止循环')
}
})
} catch(e) {
//todo
}
2.2 使用Es5新增 some() 和 every()函数
- 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
循环只要其中一个条件return true,后续的循环也不会继续执行,从而达到中止循环效果。
整个循环的结果为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
循环只有遇到return true,才会执行下一次循环;没有return 或者 return false ,后续的循环不会执行,从而达到中止循环效果。
整个循环的结果为false,否则为true。