当前位置: 首页 > Web前端 > HTML

面试官问我JS中的foreach能不能跳出循环

时间:2023-03-28 16:09:32 HTML

懵懵懂懂的时候被问到这个问题的时候脑子一片空白,因为我曾经认为forEach可能只是为了方便而创造的语法糖写作。里面也经常用到,但是一直没有想过它的问题。本文旨在记录自己的心路历程,抛砖引玉。如果能帮到你就更好了。那么回到标题,首先,forEach不能使用任何手段跳出循环,为什么呢?继续阅读。我们知道forEach接收一个函数,这个函数一般有两个参数。第一个是循环的当前元素,第二个是元素对应的下标。手动实现伪代码:Array.prototype.myForEach=function(fn){for(leti=0;i{if(element==="stop"){thrownewError("forEachBreak");}console.log(element);//输出0和1,之后没有输出});}catch(e){console.log(e.message);//forEachBreak};ForEach能跳出循环,能不能用来抛异常?对此,我想不同的人都有自己的看法。在forEach的设计中,并没有设计打断循环,但是当使用try-catch包时,当循环体过大时,性能会下降。这是无法避免的,所以throwExceptions可以作为中断forEach的手段,但并不是解决forEach问题的灵丹妙药。再次回到开头写的伪代码,优化一下,在真正的for循环中加入传入函数的判断://为避免争议,这里不覆盖原来的forEach函数Array.prototype.myForEach=function(fn){for(leti=0;i{if(x==='stop')returnfalseconsole.log(x);//输出0和1然后不输出});//返回意味着继续:arr.myForEach(x=>{if(x==='stop')returnconsole.log(x);//0134});文档中也提到了forEach需要一个同步函数,也就是说在使用异步函数或者Promise作为回调时会出现意想不到的结果,所以forEach还是需要谨慎使用。当然,用一个简单的for循环来完成一切也是一种方式。代码是先写出来供人阅读的,具有在机器上运行的功能。forEach在很多情况下使用起来是比较方便的,但是在设计这些工具功能的前提下,了解JS是如何编写我们的业务代码也是很有必要的。我们可以在遍历数组时使用for..of..,在遍历对象时使用for..in..,官方还在forEach文档下列出了一些其他的实用函数,这里就不过多展开了:Array.prototype.find()Array.prototype.findIndex()Array.prototype.map()Array.prototype.filter()Array.prototype.every()Array.prototype.some()如何根据不同的业务场景选择对应的更有效地处理业务逻辑的工具功能才是我们真正应该思考的,也许这才是我们真正想在面试中考察的。原文链接https://juejin.cn/post/697197...