前言
跳出循环分为两种,一种是跳出本次循环,另一种则是跳出整个循环,合理使用循环,终止循环对于程序的性能或多或少有点影响(处理数据量较大时比较明显)。
1. break/continue 适用于for, for...in..., for...of...等循环
break 跳出整个循环
continue 跳出当前循环
break
以for...of...为例
const arr = ['a', 'b', 'c', 'd']
for(const ele of arr) {
if(ele === 'b') break
console.log('[output]:', ele)
}
当第二次循环到‘b’的时候判断成立,break直接跳出整个循环
continue
以for...of...为例
const arr = ['a', 'b', 'c', 'd']
for(const ele of arr) {
if(ele === 'b') continue
console.log('[output]:', ele)
}
当第二次循环到‘b’的时候判断成立,continue直接跳出本次循环
2.try...catch 适用于forEach
try块中包含待测试的代码
throw来抛出一个自定义的异常,只能在try中使用(后面会有解释)
catch处理错误的代码块
try和catch语句是成对出现的
跳出本次循环
return 也可完成对本次循环的跳出,利用return终止当前函数体的执行
const arr = ['a', 'b', 'c', 'd']
arr.forEach((item, index) => {
try{
if(index === 2) {
throw new Error('下标为2,跳出循环')
}
console.log('[output]:', item)
} catch(e) {
console.log('[forEach-error]', e.message)
}
})
当循环到下标为2的时候判断成立,通过throw来抛出一个自定义的异常,直接跳出本次循环
跳出整体循环
在上述示例中,只需要稍加补充,便可完成对整体循环的终止:
const arr = ['a', 'b', 'c', 'd']
arr.forEach((item, index) => {
try{
if(index === 2) {
throw new Error('下标为2,跳出循环')
}
console.log('[output]:', item)
} catch(e) {
console.log('[forEach-error]', e.message)
throw e
}
})
throw
看到这,可能会有点疑惑🤔️🤔🤔,为什么try中的throw没有引起浏览器的报错提示呢?这也就是为什么说throw只能在try块中使用的。 我们先看一下如果不在try块中使用,会是一种什么样的情况?
throw 'error'
console.log('无所吊谓')
throw单独使用直接抛出异常,JS脚本执行结束。既然这样为什么还要用throw呢?终止执行我return不香吗?更何况控制台爆红太折磨,像有蚂蚁在身上爬🤪🤪,实在是没意义。catch是干嘛的?我就是处理try中的异常的。就相当于异常直接被catch截胡,我不抛出就轮不到你来处理。
拓展:map能否终止循环?(很有意思的一个话题)
之前看到过有关于map能否终止循环的话题?借此机会在这里聊一聊自己的看法。 首先我的观点是肯定不能终止循环的(某种意义上来讲)。
map是干嘛的?
Array方法很多,而且各有千秋,例如forEach是为了处理但不返回值的,filter是过滤值的,而map就是为了返回值的。map作为数组的方法之一,重点在于对原数组已有元素进行加工,在不改变原数组的情况下返回一个新的数组。准确的说map本身就是迭代,并不是循环。
如果可以终止循环,如何终止循环,return?try...catch?
-
首先return可以排除,map的回调函数会把return的值作为当前处理元素的值,无论return true还是return false,都会被认为是数组当前项的值。如果直接return(即使没有return),也会把undefined作为当前项的值。
当然口说无凭。上代码🤓
const arr = ['a', 'b', 'c', 'd'] let newArr = arr.map((item, index) => { console.log('[ouput]:', item) if(index === 0) { return } else if(index === 1) { return true } else if(index === 2) { return false } }) console.log(newArr)return没戏了,那试一试try...catch?
const arr = ['a', 'b', 'c', 'd'] let deelArr = arr.map((item, index) => { console.log('[ouput]:', item) if(index === 1) { try{ throw new Error('我™️跳不出去?') } catch(e) { console.log('[error]:', e.message) throw e.message } } else { return item } }) console.log(deelArr)看到这可能有些老哥坐不住了,啊,这不终止了吗?
我知道你很急,但是你先别急。确实是终止了,但是我想问的是,我的deelArr呢?之所以使用map我是冲着返回值的唉!不然我使用map的意义是什么呢?所以某种意义上来说,我认为map是不能终止循环的。
有自己见解的铁子欢迎留言发表自己的观点。