1、throw new Error()
优点:可以中断循环执行;适用于各种形式(for循环,forEach循环等)
缺点:相当于强制抛错中断执行,不仅终止了循环,后续代码也不再执行
废话不多说,上例子,找出 【找出爱吃荔枝的人】 的人:
const arr = [
{
name: '小周',
fruit: ['苹果', '香蕉']
},
{
name: '小蓝',
fruit: ['梨', '荔枝']
},
{
name: '小红',
fruit: ['樱桃', '西瓜']
},
]
console.log("开始查找爱吃荔枝的人:")
let person;
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr[i].fruit.length; j++) {
console.log("已找到:",`${arr[i].name}爱吃${arr[i].fruit[j]}`)
if (arr[i].fruit[j] === '荔枝') {
person = arr[i].name
// 在这里抛出异常
throw new Error('程序终止')
}
}
}
console.log('仍然执行。爱吃荔枝的人是:', person)
2、return语句
优点:可以中断循环执行,对于函数很方便;
缺点:只能在函数使用,不能再foreach、map等回调函数中发生作用,会阻断后续运行。
代码略
3、为循环命名,跳出对应的循环
优点:多层循环时非常灵敏(想跳出哪一层,就跳出哪一层);循环体后面的代码仍然执行
缺点:必须是for循环!
const arr = [
{
name: '小周',
fruit: ['苹果', '香蕉']
},
{
name: '小蓝',
fruit: ['梨', '荔枝']
},
{
name: '小红',
fruit: ['樱桃', '西瓜']
},
]
console.log("开始查找爱吃荔枝的人:")
let person;
outside:for (let i = 0; i < arr.length; i++) {
inside:for (let j = 0; j < arr[i].fruit.length; j++) {
console.log("已找到:",`${arr[i].name}爱吃${arr[i].fruit[j]}`)
if (arr[i].fruit[j] === '荔枝') {
person = arr[i].name
//跳出循环
break outside;
}
}
}
console.log('仍然执行。爱吃荔枝的人是:', person)