短路数组.forEach 喜欢调用中断

2022-08-29 21:55:00
[1,2,3].forEach(function(el) {
    if(el === 1) break;
});

我如何使用JavaScript中的新方法执行此操作?我试过了 ,和 . 崩溃,除了继续迭代之外什么都不做。forEachreturn;return false;breakbreakreturn


答案 1

没有内置功能。要中断执行,您必须引发某种异常。例如。breakforEach

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例外并不是非常漂亮。如果您确实需要在其中,则传统循环可能更合适。forbreak

使用数组#一些

相反,请使用 Array#some

[1, 2, 3].some(function(el) {
  console.log(el);
  return el === 2;
});

这是有效的,因为只要任何按数组顺序执行的回调返回,就会返回,使其余回调的执行短路。sometruetrue

some,它的逆 every (这将停止在 a 上),并且都是 ECMAScript 第五版方法,需要将它们添加到缺少它们的浏览器上。return falseforEachArray.prototype


答案 2

现在有一个更好的方法可以在 ECMAScript2015(又名 ES6)中使用新的 for of 循环来做到这一点。例如,此代码不打印数字 5 后面的数组元素:

const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
for (const el of arr) {
  console.log(el);
  if (el === 5) {
    break;
  }
}

从文档中:

两者都是为了...在为...的语句迭代某些内容。它们之间的主要区别在于它们迭代的内容。的...in 语句以原始插入顺序循环访问对象的可枚举属性。的...of 语句循环访问可迭代对象定义为迭代的数据。

在迭代中需要索引?您可以使用 Array.entries()

for (const [index, el] of arr.entries()) {
  if ( index === 5 ) break;
}