来自《JavaScript权威指南(6版)》7.9.1 的描述:
注意,forEach()无法在所有元素都传递给调用的函数之前终止遍历。也就是说,没有像for循环中使用的相应的break语句。如果要提前终止,必须把forEach()方法放在一个try块中,并能抛出一个异常。如果forEach()调用的函数抛出foreach.break异常,循环会提前终止:
function foreach (a, f, t) {
try { a.forEach (f, t); }
catch (e) {
if (e === foreach.break) return;
else throw e;
}
}
foreach.break = new Error("StopIteration");
将其添加到Array的prototype上:
Array.prototype.myForEach = function (f, t) {
var a = this;
try { a.forEach (f, t); }
catch (e) {
if (e == 'break') return;
else throw e;
}
}
栗子:
//返回min,max之间的数组成的数组,无序
function getArr(min,max){
if(typeof min!=='number'||typeof max !== 'number') return [];
var arr = [];
for (var i = min; i <= max; i++) {
if (arr.length<1) {
arr.push(i);
}else{
var len = arr.length;
var rIndex = Math.round(Math.random()*(len-1));
var temp = arr[rIndex];
arr[rIndex] = i;
arr.push(temp);
}
}
return arr;
}
getArr(1,20).myForEach(function (v, i) {
console.log(i + ' -> ' + v);
if (i == 10) throw 'break';
});
自定义forEach方法:
Array.prototype.myForEach = function (func) {
var arr = this;
for (var i = 0; i < arr.length; i++) {
var ret= func(arr[i], i);//回调函数
if (typeof ret !== "undefined" && (ret == null || ret == false)) break;
}
}
使用every()和some()代替:
['a', 'b', 'c'].every(function(element, index) {
// Do your thing, then:
if (you_want_to_break) return false
else return true
})