Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >面试官:如何停止 JavaScript 中的 forEach 循环?

面试官:如何停止 JavaScript 中的 forEach 循环?

作者头像
前端达人
发布于 2023-08-31 01:06:41
发布于 2023-08-31 01:06:41
25800
代码可运行
举报
文章被收录于专栏:前端达人前端达人
运行总次数:0
代码可运行
https://javascript.plainenglish.io/interview-can-you-stop-foreach-in-javascript-724d9d76fd72

面试官:你能停止 JavaScript 中的 forEach 循环吗?

在回答这个问题时,我的回答导致面试官突然结束了面试。

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

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

我的答案正确吗?

小伙伴们,下面的代码会输出什么数字呢?

它会只输出一个数字还是多个数字?

是的,它会输出‘0’、‘1’、‘2’、‘3’。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const array = [ -3, -2, -1, 0, 1, 2, 3 ]

array.forEach((it) => {
  if (it >= 0) {
    console.log(it)
    return // or break
  }
})

这是正确的!我向面试官展示了这段代码,但他仍然相信我们可以停止 JavaScript 中的 forEach 循环。

天哪,你一定是在开玩笑。

为什么?

为了说服他,我不得不再次实现forEach模拟。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Array.prototype.forEach2 = function (callback, thisCtx) {
  if (typeof callback !== 'function') {
    throw `${callback} is not a function`
  }

  const length = this.length
  let i = 0

  while (i < length) {
    if (this.hasOwnProperty(i)) {
      // Note here:Each callback function will be executed once
      callback.call(thisCtx, this[ i ], i, this)
    }
    i++
  }
}

是的,当我们使用“forEach”迭代数组时,回调将为数组的每个元素执行一次,并且我们无法过早地摆脱它。

例如,在下面的代码中,即使“func1”遇到break语句,“2”仍然会输出到控制台。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const func1 = () => {
  console.log(1)
  return
}

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

func2()

停止 forEach 的 3 种方法

你太棒了,但我想告诉你,我们至少有 3 种方法可以在 JavaScript 中停止 forEach。

1.抛出错误

当我们找到第一个大于或等于0的数字后,这段代码将无法继续。所以控制台只会打印出0。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const array = [ -3, -2, -1, 0, 1, 2, 3 ]

try {
  array.forEach((it) => {
    if (it >= 0) {
      console.log(it)
      throw Error(`We've found the target element.`)
    }
  })
} catch (err) {

}

哦!我的天啊!我简直不敢相信,这让我无法说话。

2.设置数组长度为0

请不要那么惊讶,面试官对我说。

我们还可以通过将数组的长度设置为0来中断forEach。如您所知,如果数组的长度为0,forEach将不会执行任何回调。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const array = [ -3, -2, -1, 0, 1, 2, 3 ]

array.forEach((it) => {
  if (it >= 0) {
    console.log(it)
    array.length = 0
  }
})

我的心已经乱了。

3.使用splice删除数组的元素

思路和方法2一样,如果能删除目标元素后面的所有值,那么forEach就会自动停止。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const array = [ -3, -2, -1, 0, 1, 2, 3 ]

array.forEach((it, i) => {
  if (it >= 0) {
    console.log(it)
    // Notice the sinful line of code
    array.splice(i + 1, array.length - i)
  }
})

我睁大了眼睛,我不想读这段代码。这不好。

请用for或some

我对面试官说:“哦,也许你是对的,你设法在 JavaScript 中停止了 forEach,但我认为你的老板会解雇你,因为这是一个非常糟糕的代码片段。

我不喜欢做那样的事;这会让我的同事讨厌我。”

也许我们应该使用“for”或“some”方法来解决这个问题。

1.for

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
  }
}

2. some

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const array = [ -3, -2, -1, 0, 1, 2, 3 ]

array.some((it, i) => {
  if (it >= 0) {
    console.log(it)
    return true
  }
})

总结

虽然面试官以这个问题结束了面试,但我很庆幸自己没有加入公司,不想为了某种目的而写出一段臭代码。 这样的面试官也不是面试者所喜欢的,为了面试而面试的面试官和面试题,让面试者觉得有点无辜与无奈。

不管怎么样,还是努力提升自己的技能吧。

最后,感谢您的阅读。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
分享3种可以终止forEach循环的方式
面试官:你能停止 JavaScript 中的 forEach 循环吗?这是我在面试中曾被问到的一个问题,我当初的回答是:“不,我不能这样做。”
前端达人
2023/12/26
8300
分享3种可以终止forEach循环的方式
JavaScript专项算法题(1):回调和高阶函数
题解: // Challenge 1 function addTwo(num) { return num + 2; }
卢衍飞
2023/02/14
3840
如何写出一个惊艳面试官的深拷贝
最近经常看到很多 JavaScript手写代码的文章总结,里面提供了很多 JavaScriptApi的手写实现。
ConardLi
2019/09/03
10.8K6
如何写出一个惊艳面试官的深拷贝
JavaScript中的forEach,你踩过哪些坑?请避开这些常见误区
在JavaScript的世界里,forEach是我们常用的数组遍历方法之一。大多数开发者都熟悉它的基础用法,但你知道吗?在处理异步操作时,forEach可能会让你掉进一些意想不到的“坑”。这篇文章将带你深入了解forEach的特性和局限,揭示一些你可能不知道的使用技巧和解决方案。无论你是前端新手,还是经验丰富的开发者,都能从中学到有用的知识,帮助你在实际项目中避开那些隐藏的陷阱。准备好了吗?让我们一探究竟!
前端达人
2024/11/25
2250
JavaScript中的forEach,你踩过哪些坑?请避开这些常见误区
「查缺补漏」送你 54 道 JavaScript 面试题
. VS = 操作符优先级 let a = {n : 1}; let b = a; a.x = a = {n: 2}; console.log(a.x) console.log(b.x) 输出是什么呢? 真的想明白了吗? 答案 undefined { n : 2} 你真的了解作用域吗 var a = 0, b = 0; function A(a) {
童欧巴
2020/12/15
1.1K0
一文彻底弄懂 for forEach for-in for-of 的区别
在 JavaScript 中所有的数组都是对象,这意味着你可以给数组添加字符串属性:
JS菌
2019/04/10
1.1K0
一文彻底弄懂 for forEach for-in for-of 的区别
JavaScript专项算法题(2):函数式编程
题解: // Challenge 1 const addTwo = (num) => {
卢衍飞
2023/02/14
2650
通过事例重温一下常见的 JS 中 15 种数组操作(备忘清单)
数组是 JS 中广泛使用的数据结构。数组对象提供了大量有用的方法,如array. forEach()、array.map()等来操作数组。
前端达人
2019/12/24
1.2K0
面试官:请实现一个JavaScript深拷贝
实现一个深克隆是面试中常见的问题的,可是绝大多数面试者的答案都是不完整的,甚至是错误的,这个时候面试官会不断追问,看看你到底理解不理解深克隆的原理,很多情况下一些一知半解的面试者就原形毕漏了.
loveX001
2022/09/29
3620
javascript闭包
## 定义 **闭包:**有权访问另一个函数作用域中的变量的函数。 ## 解析 相信刚看到这个定义,很多人肯定很迷糊,现在给出示例。 ``` function func1(){ var a = 1; function func2(){ a++; console.log(a); }; return func2; } var res = func1();//等于func2 res();//等于func2(),输出2 ``` 首先定义了func1,
用户1624346
2018/04/10
7670
如何答一道惊艳面试官的数组去重问题?
思想: 双重 for 循环是比较笨拙的方法,它实现的原理很简单:先定义一个包含原始数组第一个元素的数组,然后遍历原始数组,将原始数组中的每个元素与新数组中的每个元素进行比对,如果不重复则添加到新数组中,最后返回新数组;因为它的时间复杂度是O(n^2),如果数组长度很大,效率会很低。
coder_koala
2019/12/27
1.3K0
如何答一道惊艳面试官的数组去重问题?
JavaScript对象和数组
在JavaScript中对象是一种数据结构,用于将数据和功能组织在一起,描述一类对象所具有的属性和方法。 对象是某个特定类型的实例。新对象是new操作符后跟一个关键字来实现的。构造函数本身就是一个函数,用于创建新对象。 var person = new Object();这行代码创建了一个Object的实例,并将值保存了变量person中。 创建对象的方式有两种,一种是通过Object函数来创建。 var animal = new Object(); animal.eat=f
水击三千
2018/02/27
1.6K0
面试官问发布订阅模式是在问什么?
本文来自 @simonezhou 小姐姐投稿的第八期笔记。面试官常问发布订阅、观察者模式,我们日常开发也很常用。文章讲述了 mitt、tiny-emitter、Vue eventBus这三个发布订阅、观察者模式相关的源码。
若川
2021/11/18
9320
面试官问发布订阅模式是在问什么?
[第27 期]彻底分清Javascript forEach & map
JavaScript 中,数组的遍历我们肯定都不陌生,最常见的两个便是forEach 和 map。
皮小蛋
2020/03/02
4830
原生JS灵魂之问,看看你是否熟悉JavaScript?
笔者最近在对原生JS的知识做系统梳理,因为我觉得JS作为前端工程师的根本技术,学再多遍都不为过。打算来做一个系列,一共分三次发,以一系列的问题为驱动,当然也会有追问和扩展,内容系统且完整,对初中级选手会有很好的提升,高级选手也会得到复习和巩固。这是本系列的第二篇。
ConardLi
2019/11/12
1.4K0
原生JS灵魂之问,看看你是否熟悉JavaScript?
JavaScript 前端知识点总结
Java Script 是基于对象的脚本语言,而不是面向对象中所使用的那个对象,之所以说JS是一门基于对象的编程语言,是因为它没有提供抽象,继承,封装等面向对象语言的很多功能,而是把其他语言所创建的复杂对象统一起来,从而形成一个非常强大的对象系统.
王瑞MVP
2022/12/28
2.5K0
你不得不看的81条JavaScript编码小技巧,吐血整理,建议收藏
对于不包含大逻辑的 if-else 条件,可以使用下面的快捷写法。我们可以简单地使用三元运算符来实现这种简化。
CherishTheYouth
2021/08/31
2.2K0
前端面试算法题目浅析
本小节会带领大家快速过一遍数据结构和算法,重点讲解一些常考、前端会用到的算法和数据结构。
江拥羡橙
2023/11/21
2340
前端面试算法题目浅析
前端模拟面试:7个JavaScript数组进阶面试题
你坐在面试室里,对面的面试官微笑着,轻敲着桌面问道:“那我们来聊聊 JavaScript 吧。数组操作你有多熟悉?”你意识到,眼前这个问题看似简单,但面试官可能在考察你对 JavaScript 基础知识的深度掌握和灵活运用。你深吸一口气,准备好好展示一番,从最常见的查找最大值问题入手,一步步展示自己的思路。
前端达人
2024/11/25
1170
前端模拟面试:7个JavaScript数组进阶面试题
JavaScript中常用的数组方法总结
forEach()函数是JavaScript数组提供的一个用于遍历数组的方法。它接受一个回调函数作为参数,并且对数组中的每个元素依次调用该回调函数。
九仞山
2023/10/14
3330
推荐阅读
相关推荐
分享3种可以终止forEach循环的方式
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验