大家都知道 js 的 forEach里是不能使用break。但是为什么不能在forEach里使用呢?在forEach里使用break 会发生什么呢?

一. 在forEach里使用break 会发生什么

纸上得来终觉浅,绝知此事要躬行。要想知道发生什么,不妨在代码里验证一下。

let arr = [1, 2, 3, 4, 5];

arr.forEach((item, index) => {
if (item > 2) {
break
}
console.log(item)
}) // SyntaxError: Illegal break statement (非法中断语句)

在控制台可以看到输出:语法错误。

二. 为什么不能在forEach里使用break

要想知道forEach里为什么不能使用break,必须先要搞清楚break的语法。

你真的了解break吗

break 表示中止当前循环。

语法:break [label];

label:与语句标签相关联的标识符。如果 break 语句不在一个循环或者Switch语句中,则该项是必须的。

我们看一个例子:

我们平时正常使用时

let arr = [1, 2, 3, 4, 5]

for (let i = 0; i < arr.length; i++) {
if (arr[i] > 2) {
break // 大于2 跳出整个循环
}
console.log(arr[i]) // 1, 2
}

break 与语句标签一起使用时

let arr = [1, 2, 3, 4, 5]

outer_block: // 标识最外层循环
for (let i = 0; i < arr.length; i++) {
console.log('i', arr[i]) // 1
inner_block: // 标识里面的for循环
for (let j = 0; j < arr.length; j++) {
if (j > 3) {
break outer_block // 跳出最外层循环
}
console.log('j', arr[j]) // 1, 2, 3, 4
}
}

输出结果:最外层输出:1,最次层输出:1,2,3,4。可以看出brake终止循环是有条件的。我们在回来看forEach这个问题。

先看下forEach语法:

forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void;

是上面的定义相当于:

Array.prototype.forEach = function(callback) {
for (let i = 0; i < this.length; i++) {
callback(this[i], i, this);
}
};

可以看出:我们在forEach里使用break,其实是在callback里使用break。再明白一点,其实就是相当于你在for循环里这样写:

let arr = [1, 2, 3, 4, 5]

outer_block:
for (let i = 0; i < arr.length; i++) {
console.log('i', arr[i])
inner_block1:
(function() {
inner_block2:
break // 报错,不能直接使用break
})()
}

到这里我想你已经明白了为什么不能在forEach里使用break了。回到本文的题目上来。

如何在forEach的循环里break?

查阅MDN,上面有一个备注:

编辑切换为居中

MDN

在forEach里合法的使用break

function breakInForEach(arr) {
let BreakException = {};
let res = false;
try {
arr.forEach(item => {
if (item === 2) {
res = true;
throw BreakException;
}
})
}
catch(e) {
if (e !== BreakException) throw e
}
return res;
} console.log(foreachBreak([1, 2, 3, 4, 5, 6])); // true

也可以使用every 或者 some等

最推荐的方式呢,就是这种需要break的场景下,直接使用every或者some。

  • every: 碰到return false的时候,循环中止,return true 循环继续;
  • some: 碰到return ture的时候,循环中止,return false 循环继续;

总结

本文介绍了为什么不能在forEach里使用break;在forEach里使用break 会发生什么以及怎样在forEach里使用break。

程序员面试题库分享

1、前端面试题库 (面试必备)            推荐:★★★★★

地址:前端面试题库

2、前端技术导航大全      推荐:★★★★★

地址:前端技术导航大全

3、开发者颜色值转换工具   推荐:★★★★★

地址 :开发者颜色值转换工具

最新文章

  1. [Android下载]北京新版小学英语三年级上册点读手机软件
  2. mapreduce导出MSSQL的数据到HDFS
  3. 再读&lt;&lt;基于MVC的JavaScript Web 富应用开发&gt;&gt;
  4. 转数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示
  5. JQuery上传插件uploadify优化
  6. 鼠标进入与离开的消息(覆盖CM_MOUSEENTER与CM_MOUSELEAVE消息)——Windows本身没有这样的消息
  7. OSS.Common获取枚举字典列表标准库支持
  8. 第 4 章 MySQL 安全管理
  9. 实时音视频互动系列(下):基于 WebRTC 技术的实战解析
  10. Java数据结构和算法(八)——递归
  11. Android 防内存泄露handler
  12. Android使用https与服务器交互的正确姿势
  13. angular 引入编辑器以及控制器的学习和理解。。。
  14. 几个java小例子
  15. [转][C#]压缩解压
  16. 【PAT】B1063 计算谱半径(20 分)
  17. 关于x210开发板和主机、虚拟机ping通问题
  18. oracle partition table 分区表详解
  19. VS 远程调试 Azure Web App
  20. 使用ApiPost测试接口时需要先登录怎么办?利用Cookie模拟登陆!

热门文章

  1. Earthdata批量下载MODIS遥感影像的方法
  2. ElasticSearch必知必会-进阶篇
  3. 解决安装node-sass报错的方法
  4. BUG日记之——MP使用EeasyExcel技术,读取Excel并保存到数据库中出错
  5. Keil 5(Keil C51)安装与注册 [ 图文教程 ]
  6. Unity_UIWidgets - 组件Container
  7. 12月19日内容总结——Q查询进阶、ORM查询优化、ORM事务、ORM常用字段类型和字段参数、Ajax介绍、数据编码格式、Ajax携带文件数据
  8. Pytest插件之pytest-base-url切换测试环境
  9. 数据同步gossip协议原理与应用场景介绍
  10. 合肥光源储存环束流三维参数测量系统相关PV