循环遍历
js对象中,可枚举性(enumerable)是什么?
如果不可枚举,for...in, Object.keys(), JSON.stringify()无法获取其值
forEach中return有效果吗?如何中断forEach循环?
在forEach中用return不会返回,函数会继续执行。
forEach跳出循环体
- 跳出本次循环
forEach 跳出本次循环,使用return
[1,2,3,4,5].forEach(function(item,index){
if(item == 3){
return
}
console.log(3)// item == 3时,执行不到该部分,结束本次循环
})
- 跳出整个循环
forEach 跳出整个循环,需要抛出异常
try {
[1,2,3,4,5].forEach(function(item,index){
if(item == 3){
thorw new Error(); //结束整体循环
}
})
} catch(e) {
}
- 跳出嵌套循环
try {
["a","b","c"].forEach(function(item,index){
try {
[1,2,3,4,5].forEach(function(item,index){
if(item == 3){
thorw new Error(); //结束整体循环
}
})
} finally{}//try不能单独存在
<!--catch(e) {-->
//内层的catch不能存在,不然会捕获异常,只结束内层forEach
<!--}-->
})
} catch(e) { //在最外层捕获异常,可结束嵌套循环
}
中断方法
- 使用try监视代码块,在需要中断的地方抛出异常。
- 官方推荐方法(替换方法):用every和some替代forEach函数。
- every在碰到return false的时候,中止循环。
- some在碰到return true的时候,中止循环。
for...in 和 for...of 的区别
for...in 和 for...of 是两种在 JavaScript 中用于迭代的循环语句,它们之间有以下区别:
-
用途:
for...in:for...in语句用于迭代对象的可枚举属性(包括原型链上的属性)。它通常用于迭代对象的属性名称,而不是属性值。for...of:for...of语句用于迭代可迭代对象(如数组、字符串、Set、Map、Generator 等)。它用于获取可迭代对象的值,而不是索引或属性名称。
-
迭代顺序:
for...in:for...in循环按照对象属性的插入顺序迭代。但由于它会遍历对象的原型链,所以无法保证属性的顺序。for...of:for...of循环按照可迭代对象的迭代器规则,以定义的顺序依次迭代每个元素。
-
迭代内容:
for...in:for...in循环返回的是属性名称(字符串类型),可以通过对象的属性名称访问对应的属性值。for...of:for...of循环返回的是可迭代对象的值,可以直接访问每个元素的值。
-
支持的对象类型:
for...in:for...in循环适用于迭代普通对象的属性,包括原型链上的可枚举属性。for...of:for...of循环适用于迭代实现了迭代器接口(Iterable 接口)的对象,如数组、字符串、Set、Map、Generator 等。
示例代码如下:
// for...in 示例
const obj = { a: 1, b: 2, c: 3 };
for (const prop in obj) {
console.log(prop); // 输出属性名称 a, b, c
console.log(obj[prop]); // 输出属性值 1, 2, 3
}
// for...of 示例
const arr = [1, 2, 3];
for (const value of arr) {
console.log(value); // 输出数组元素的值 1, 2, 3
}
总结起来,for...in 用于迭代对象的属性名称,for...of 用于迭代可迭代对象的值。在处理对象时,for...in 循环会遍历属性和原型链上的属性,而 for...of 循环不适用于普通对象,只适用于实现了迭代器接口的对象。