js结束循环
for循环
终止for循环的方式:break和continue
break:退出循环 continue:退出本次循环
let list = [1, 2, 3, 4]
for (let i = 0; i < list.length; i++) {
if (i == 1) { // i = 1时退出本次循环 并 开始下一次循环
continue
}
if (i == 2) { // i = 2时直接退出循环
break;
}
}
forEach循环
用return、break、continue的方式都不能终止forEach循环,return在forEach里相当于for循环里的continue,能够退出本次循环
为什么forEach不能用return或break?
-
先看看forEach的语法:
arr.forEach(callback(currentValue [, index [, array]])[, thisArg])
-
forEach 实现的原理:
Array.prototype.simpleForEach = function(callback) { for (var i = 0; i < this.length; i++) callback(this[i], i, this); }
可以看出,其实是callback在进行真正的操作,for循环的每次遍历都执行了一次callback方法,而我们在外部传入的return或break只是在callback函数里,和外层的for循环不在同一个作用域,我们只是结束了当前的callback,但是for循环还会继续
没有方法可以跳出forEach循环了吗?
当然是有的,用try…catch捕获异常即可
try {
var array = ["first","second","third","fourth"];
// 执行到第3次,结束循环
array.forEach(function(item,index){
if (item == "third") {
throw new Error("EndIterative");
}
alert(item);// first,second
});
} catch(e) {
if (e.message != "EndIterative") {
throw e;
} else {
return // 如果跳出forEach循环的同时要终止下面的代码执行 则写这个 如果要继续执行下面的代码 则不需要return
}
};
// 下面的代码不影响继续执行
alert(10);
map循环
map和forEach很相似,但也有区别
map和forEach的区别
- map不会改变原数组,而是会返回一个新的数组,数组中的元素为原数组调用callback函数处理后的值;如果是空数组,map返回的也是空数组
- forEach只针对数组的每个元素调用callback,没有返回值,对于空数组是不会调用回调函数的,也没有返回值
终止map循环的方式和forEach相同
let list = [1, 2, 3, 4]
try {
list?.map(item => {
console.log('执行');
if (item == 1) {
throw new Error('stop')
}
})
} catch (e) {
if (e.message !== 'stop') {
throw e
}
}
list?.some(item => {
if (item == 1) {
return true
}
})
其实可以看出,forEach和map并不适合提前终止循环的情景,可以用every()、some()代替
for in 循环
for…in循环主要是为了遍历对象的,break或continue可以生效
注:当
for...in
用来遍历数组时,遍历的结果为当前元素索引值的字符串形式
const person = {
name: "111",
age: 18,
1: 1,
job: "student",
};
for (const key in person) {
if (key === "age") {
break;
}
if (key === 'name') {
continue;
}
}
for of 循环
for…of和for…in都能用break和continue结束(跳出当前)循环
我们都知道for...of
只能用来遍历那些内置iterator
(Array, Atring, ArrayLike, Set, Map…)或者实现了@@iterator
方法的数据类型,而普通的Object
并没有内置iterator
for (const val of arr) {
if (val === 2) {
continue;
}
if (val === 3) {
break;
}
}
every()和some()
every():相当于且,只要有一个不满足条件,就return false,只有都满足条件才会返回true
some():相当于或,只要有一个满足条件,就return true
let list = [
{ name:"aaa", age:3 },
{ name:"bbb", age:4 },
{ name:"ccc", age:5 },
]
var every = list.every(function (item) {
return item.age > 4
})
console.log(eve) // false
var some = list.some(function (item) {
return item.age > 4
})
console.log(some) // true
some退出循环:return / return true(不能return false)
every退出循环:return false