(面试题) 面试官:如何在forEach的循环里使用break
大家都知道 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、开发者颜色值转换工具 推荐:★★★★★
地址 :开发者颜色值转换工具
(面试题) 面试官:如何在forEach的循环里使用break的更多相关文章
- Android相关面试题---面试官常问问题
版权声明:本文为寻梦-finddreams原创文章,请关注: http://blog.csdn.net/finddreams/article/details/44513579 一般的面试流程是笔试完就 ...
- 走向DBA[MSSQL篇] 面试官最喜欢的问题 ----索引+C#面试题客串
原文:走向DBA[MSSQL篇] 面试官最喜欢的问题 ----索引+C#面试题客串 对大量数据进行查询时,可以应用到索引技术.索引是一种特殊类型的数据库对象,它保存着数据表中一列或者多列的排序结果,有 ...
- 【BAT面试题系列】面试官:你了解乐观锁和悲观锁吗?
前言 乐观锁和悲观锁问题,是出现频率比较高的面试题.本文将由浅入深,逐步介绍它们的基本概念.实现方式(含实例).适用场景,以及可能遇到的面试官追问,希望能够帮助你打动面试官. 目录 一.基本概念 二. ...
- Tomcat相关面试题,看这篇就够了!保证能让面试官颤抖!
Tomcat相关的面试题出场的几率并不高,正式因为如此,很多人忽略了对Tomcat相关技能的掌握. 这次整理了Tomcat相关的系统架构,介绍了Server.Service.Connector.Con ...
- (转)史上最全 40 道 Dubbo 面试题及答案,看完碾压面试官!
背景:因为自己的简历写了dubbo,面试时候经常被问到.实际自己对dubbo的认识只停留在使用阶段,所以有必要好好补充下基础的理论知识. https://zhuanlan.zhihu.com/p/45 ...
- 史上最全 40 道 Dubbo 面试题及答案,看完碾压面试官
想往高处走,怎么能不懂 Dubbo? Dubbo是国内最出名的分布式服务框架,也是 Java 程序员必备的必会的框架之一.Dubbo 更是中高级面试过程中经常会问的技术,无论你是否用过,你都必须熟悉. ...
- 一线大厂面试官最喜欢问的15道Java多线程面试题
前言 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得更多职位,那么你应该准备很多关于多线程的问题. 他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者 ...
- 面试官:你对Redis缓存了解吗?面对这11道面试题你是否有很多问号?
前言 关于Redis的知识,总结了一个脑图分享给大家 1.在项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果? 面试官心理分析 这个问题,互联网公司必问,要是一个人连缓存都不太清楚, ...
- 面试官:如何在Integer类型的ArrayList中同时添加String、Character、Boolean等类型的数据? | Java反射高级应用
原文链接:原文来自公众号:C you again,欢迎关注! 1.问题描述 "如何在Integer类型的ArrayList中同时添加String.Character.Boolean等 ...
- 100道Java高频面试题(阿里面试官整理)
我分享文章的时候,有个读者回复说他去年就关注了我的微信公众号,打算看完我的所有文章,然后去面试,结果我后来很长时间不更新了...所以为了弥补一直等我的娃儿们,给大家的金三银四准备了100道花时间准备的 ...
随机推荐
- 计算1+2!+3!+...+n!的和
计算1+2!+3!+...+n!的和 Code 点击查看代码 #include<iostream> #include<vector> using namespace std; ...
- SPOJ GCDMAT - GCD OF MATRIX
简要题意 给出三个整数 \(T,n,m\),\(T\) 组询问,每组询问给出四个整数 \(i_1,j_1,i_2,j_2\)(数据保证 \(i_1,j_1\leq n\ \ i_2,j_2\leq m ...
- Java 入门与进阶P-7.1+P-7.2
函数的定义 函数的定义 习惯把函数也叫成方法,都是一个意思:函数是具备特定功能的一段代码块,解决了重复性代码的问题. 为什么要定函数呢? 目的是为了提高程序的复用性和可读性. 函数的格式 修饰符返回值 ...
- Python 异步集群使用
目前在做Python项目用到同步和异步的方法使用Redis单机,现在要增加兼容Redis集群.也就说当前项目用到中以下4种Python使用Redis的方法都用到了. - 同步 异步 单机 涉及 涉及 ...
- 将Grafana嵌入自己的应用
什么是Grafana Grafana是一款强大的可视化工具,无论数据存储在哪里,都可以查询.可视化.警报和理解您的数据.使用Grafana,您可以通过美丽.灵活的仪表板创建.探索和共享所有数据. 场景 ...
- elasticsearch中使用bucket script进行聚合
目录 1.背景 2.需求 3.准备数据 3.1 mapping 3.2 插入数据 4.bucket_script聚合的语法 5.聚合 5.1 根据月份分组排序 5.2 统计每个月卖了多少辆车 5.3 ...
- saas架构之druid解析表名
public void preHandle(BoundSql boundSql, RequestEntity requestEntity) { System.out.println("要执行 ...
- activiti03 SSM使用activity
1.添加依赖 <!--activity依赖--> <dependency> <groupId>org.activiti</groupId> <ar ...
- python3中,isinstance() 函数
#isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type(). #返回值:如果对象的类型与参数二的类型相同则返回True,否则返回False 使用isinstance函数的实 ...
- cannot load "mso.dll" vs2008 web开发问题
已成功解决办法: ①将VS 2008安装包WCUWebDesignerCoreWebDesignerCore.exe提取并重新安装: ②将C:Program Files/Common Files/Mi ...