[1,2,3].forEach(function(el) {
if(el === 1) break;
});
如何使用forEach
JavaScript 中的新方法执行此操作?我试过了return;
,return false;
而且break
。break
崩溃,return
除了继续迭代什么都不做。
[1,2,3].forEach(function(el) {
if(el === 1) break;
});
如何使用forEach
JavaScript 中的新方法执行此操作?我试过了return;
,return false;
而且break
。break
崩溃,return
除了继续迭代什么都不做。
有没有内置的能力break
的forEach
。要中断执行,您必须抛出某种异常。例如。
var BreakException = {};
try {
[1, 2, 3].forEach(function(el) {
console.log(el);
if (el === 2) throw BreakException;
});
} catch (e) {
if (e !== BreakException) throw e;
}
JavaScript 异常并不是非常漂亮。for
如果你真的需要在break
里面,传统的循环可能更合适。
Array#some
相反,使用Array#some
:
[1, 2, 3].some(function(el) {
console.log(el);
return el === 2;
});
这是有效的,因为只要以数组顺序执行的任何回调some
返回true
,就会返回true
,从而使其余的执行短路。
some
,它的反面every
(将在 a 处停止return false
),并且forEach
都是 ECMAScript Fifth Edition 方法,需要将它们添加到Array.prototype
缺少它们的浏览器中。
现在在 ECMAScript2015(又名 ES6)中使用新的for of loop有更好的方法来做到这一点。例如,此代码不会打印数字 5 之后的数组元素:
let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
for (let el of arr) {
console.log(el);
if (el === 5) {
break;
}
}
从文档:
无论对于...在和对...的语句迭代的东西。它们之间的主要区别在于它们迭代的内容。在为...在声明中遍历对象的枚举的属性,在原来的插入顺序。在对...的语句迭代数据迭代的对象定义要遍历。
需要迭代中的索引吗?您可以使用Array.entries()
:
for (const [index, el] of arr.entries()) {
if ( index === 5 ) break;
}
您可以使用每种方法:
[1,2,3].every(function(el) {
return !(el === 1);
});
ES6
[1,2,3].every( el => el !== 1 )
对于旧浏览器支持使用:
if (!Array.prototype.every)
{
Array.prototype.every = function(fun /*, thisp*/)
{
var len = this.length;
if (typeof fun != "function")
throw new TypeError();
var thisp = arguments[1];
for (var i = 0; i < len; i++)
{
if (i in this &&
!fun.call(thisp, this[i], i, this))
return false;
}
return true;
};
}
更多细节在这里。
引自MDN 文档Array.prototype.forEach()
:
有没有办法阻止或打破一个
forEach()
比抛出异常等循环。如果您需要这种行为,则该.forEach()
方法是错误的工具,请改用普通循环。如果您正在测试谓词的数组元素并需要布尔返回值,则可以使用every()
或some()
代替。
对于您的代码(在问题中),如@bobince 所建议的,请Array.prototype.some()
改用。它非常适合您的用例。
Array.prototype.some()
为数组中存在的每个元素执行一次回调函数,直到找到一个回调函数返回真值(转换为 a 时变为真值的值Boolean
)。如果找到这样的元素,则some()
立即返回 true。否则,some()
返回假。仅对已分配值的数组索引调用回调;不会为已删除或从未分配值的索引调用它。
不幸的是,在这种情况下,如果您不使用forEach
. 而是使用常规for
循环,它现在将完全按照您的预期工作。
var array = [1, 2, 3];
for (var i = 0; i < array.length; i++) {
if (array[i] === 1){
break;
}
}