你实际上可以用这5种方式打破 JavaScript 中的 forEach 循环

你能在 JavaScript 中跳出 "forEach" 循环吗?

这是一个很棒的问题,可以挑战你对 JavaScript 的真正了解程度。

因为我们不是在讨论 for 循环 — 否则这将会非常简单:你只需要使用 break

4b4272df0aa02760de4103ccd5eb0449.png

但你不敢在 forEach 中这样做,否则会发生灾难:

101798b1100996379ea95ef750defe76.png

return 呢?嗯...

你认为这里会发生什么:

fd449551dbfbd881862498181f734983.png

return 应该在 5 时轻松结束循环并带我们到外部的 log,对吧?

错了:

f8e82bb7c1a5fb21faeb5b9b2326f77d.png

记住:forEach 接受一个回调函数,并为数组中的每个项目调用它。

// 类似这样的:
Array.prototype.forEach = function (callback, thisCtx) {
  const length = this.length;
  let i = 0;

  while (i < length) {
    // 📣 callback 仅运行一次
    callback.call(thisCtx, this[i], i, this);
    i++;
  }
};

所以 return 只是结束当前的回调调用和迭代;对停止整个循环完全没有作用。

就像这里;试图从 func1() 结束 func2() — 显然不会起作用:

9822ef46bb0c57953e0be812411e6243.png

5种糟糕的方式来停止 forEach 循环

1. 抛出异常

你可以通过抛出异常来停止任何 forEach 循环:

6ee2c3cbc6da69d5d4d87e16620216cb.png

当然,我们这里只是在开玩笑 — 在真实世界的代码中看到这样的做法会很糟糕。我们只为问题创建异常,而不是为了这样的计划代码。

2. process.exit()

这个方法更极端:

const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

nums.forEach((num) => {
  if (num === 5) {
    process.exit(0);
  }
  console.log(num);
});

你不仅结束了循环,还结束了整个程序!

你甚至不会看到这里的 console.log()

9c8835a9e9078ded90c4e82831181f59.png

3. Array.some()

这是不好的做法。

324efb3e37954b1f88157e274482f2ef.png

它能工作,一些人推荐用它来做这个;但这降低了可读性,因为它显然不是为此而设计的。

这才是它的设计目的:

const hasEven = [1, 2, 3, 4, 5].some(num => num % 2 === 0);
console.log(hasEven); // true

4. 将数组长度设为 0

但这里有一个更大胆的方法:将数组的长度设置为 0

const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

nums.forEach((num) => {
  if (num === 5) {
    process.exit(0);
  }
  console.log(num);
});

设置数组的长度完全破坏并重置它 — 变成空数组:

6f35e2026c3ef0b8b6cabb052f1deeb8.png

5. 使用 Array.splice()

当你使用 Array.splice() 来停止 forEach 循环时,事情变得更奇怪,在中途删除切割元素!

97fa96c31a0c93562075b4495b3be190.png

3种很好的方式来停止循环

1. 你真的需要打破循环吗?

与其使用上面那些可怕的方法来停止 forEach 循环...

为什么不重构你的代码使你根本不需要打破循环

所以,与其这样:

const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

try {
  nums.forEach((num) => {
    if (num === 5) { // ❌ 在数字 5 时退出循环
      throw new Error('just to stop a loop?');
    }
    console.log(num);
  });
} catch (e) {
  console.log('finally stopped!');
}

我们可以简单地这样做:

d6a003e0ff651a5f30c38834d471a921.png

2. 使用 for...of

但如果你真的想提前跳出循环,那么使用 for..of 循环会好得多:

const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

try {
  for (const num of nums) {
    if (num === 5) {
      break; // 👈 break works
    }
    console.log(num);
  }
} catch {
  console.log('finally stopped!');
}

3. 使用传统的 for

或者使用传统的 for 循环,以获得更精细的控制:

for (let i = 1; i <= 9; i++) {
  console.log(i);
  if (i === 5) break;
}

最后的思考

所以有一些方法可以从 forEach 循环"跳出",但它们相当混乱和疯狂。

相反,试着重构代码以避免一开始就需要跳出。或者切换到 forfor..of 以获得更清晰、可读的方法。

最后:

CSS技巧与案例详解

vue2与vue3技巧合集

VueUse源码解读

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@大迁世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值