三种在JavaScript中终止forEach循环的方式

开发 前端
面试官:你能停止 JavaScript 中的 forEach 循环吗?这是我在面试中曾被问到的一个问题,我当初的回答是:“不,我不能这样做。”

面试官:你能停止 JavaScript 中的 forEach 循环吗?这是我在面试中曾被问到的一个问题,我当初的回答是:“不,我不能这样做。”

不幸的是,我的回答导致面试官突然结束了面试,对的,是突然结束的!

我对结果感到沮丧,问面试官:“为什么?实际上可以停止 JavaScript 中的 forEach 循环吗?”

在面试官回答之前,我花了一些时间解释我对为什么我们不能直接停止 JavaScript 中的 forEach 循环的理解。

一、序言

这个问题估计会难倒一部分同学。甚至会有人反问,forEach循环在JavaScript中能终止吗? 比如 ,我举个例子

const array = [ -3, -2, -1, 0, 1, 2, 3 ]
 
array.forEach((it) => {
  if (it >= 0) {
    console.log(it)
    // 0 1 2 3
    return // or break
  }
})

从这个例子来看,好像不管是通过return还是break都无法终止forEach循环。 forEach相当于就是函数的执行,比如下面这段代码,即使func1执行了return语句,仍然会打印出2。

const func1 = () => {
  console.log(1)
  return
}
 
const func2 = () => {
  func1()
  console.log(2)
}
 
func2()

二、终止方法

然而,我能想到三种方式可以终止forEach循环。

1. 抛出错误

当找到一个大于等于0的数字之后,return循环将终止执行,所以控制台只会输出数字0,代码如下:

const array = [ -3, -2, -1, 0, 1, 2, 3 ]
 
try {
  array.forEach((it) => {
    if (it >= 0) {
      console.log(it) // 输出:0
      throw Error(`We've found the target element.`)
    }
  })
} catch (err) {


}

2. 将数组长度设置成0

我们也能通过将数组长度设置成0来终止forEach循环。代码如下

const array = [ -3, -2, -1, 0, 1, 2, 3 ]
 
array.forEach((it) => {
  if (it >= 0) {
    console.log(it) // 输出:0
    array.length = 0
  }
})

3. 将数组元素移除

当满足条件时,使用splice方法将数组内元素移除,也能终止forEach循环。代码如下:

const array = [ -3, -2, -1, 0, 1, 2, 3 ]
 
array.forEach((it, i) => {
  if (it >= 0) {
    console.log(it) // 输出:0
    array.splice(i + 1, array.length - i)
  }
})

三、建议

建议使用for和some

在日常工作中,一般是不会出现一种情况是让你终止forEach循环的,如果有终止的情况,可以使用for和some方法。

for

const array = [ -3, -2, -1, 0, 1, 2, 3 ]
 
for (let i = 0, len = array.length; i < len; i++) {
  if (array[ i ] >= 0) {
    console.log(array[ i ])
    break
  }
}

some

const array = [ -3, -2, -1, 0, 1, 2, 3 ]
 
array.some((it, i) => {
  if (it >= 0) {
    console.log(it)
    return true
  }
})

最后,3种关于在JavaScript中终止forEach循环的方法就先介绍到这里了,希望对你有所帮助,感谢你的阅读,编程快乐!

责任编辑:华轩 来源: web前端开发
相关推荐

2011-06-03 11:53:06

Spring接口

2023-11-01 13:22:15

Java循环

2012-07-17 09:16:16

SpringSSH

2020-08-12 08:51:19

Go语言Concurrency后台

2022-06-26 06:31:25

Linux电子游戏

2020-11-01 17:10:46

异步事件开发前端

2010-03-12 17:52:35

Python输入方式

2022-04-18 09:24:36

PyCharmPythonUbuntu

2024-03-11 01:00:00

jsfor循环

2022-01-17 08:19:51

Javascript 接口前端

2011-07-22 17:22:20

Spring

2013-06-17 17:08:47

Windows PhoWP开发共享数据方式

2015-01-05 09:56:20

可穿戴设备

2023-10-18 11:12:01

增强现实VR

2009-07-20 15:08:41

Spring实例化Be

2022-08-19 11:19:49

单元测试Python

2022-10-18 10:41:44

Flowable服务任务

2014-12-31 17:42:47

LBSAndroid地图

2021-11-05 21:33:28

Redis数据高并发

2021-06-24 08:52:19

单点登录代码前端
点赞
收藏

51CTO技术栈公众号