跳到主要内容

循环遍历

js对象中,可枚举性(enumerable)是什么?

如果不可枚举,for...in, Object.keys(), JSON.stringify()无法获取其值

forEach中return有效果吗?如何中断forEach循环?

在forEach中用return不会返回,函数会继续执行。

forEach跳出循环体

  1. 跳出本次循环
forEach 跳出本次循环,使用return
[1,2,3,4,5].forEach(function(item,index){
if(item == 3){
return
}
console.log(3)// item == 3时,执行不到该部分,结束本次循环
})

  1. 跳出整个循环
forEach 跳出整个循环,需要抛出异常
try {
[1,2,3,4,5].forEach(function(item,index){
if(item == 3){
thorw new Error(); //结束整体循环
}
})
} catch(e) {

}
  1. 跳出嵌套循环
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...infor...of 是两种在 JavaScript 中用于迭代的循环语句,它们之间有以下区别:

  1. 用途:

    • for...infor...in 语句用于迭代对象的可枚举属性(包括原型链上的属性)。它通常用于迭代对象的属性名称,而不是属性值。
    • for...offor...of 语句用于迭代可迭代对象(如数组、字符串、Set、Map、Generator 等)。它用于获取可迭代对象的值,而不是索引或属性名称。
  2. 迭代顺序:

    • for...infor...in 循环按照对象属性的插入顺序迭代。但由于它会遍历对象的原型链,所以无法保证属性的顺序。
    • for...offor...of 循环按照可迭代对象的迭代器规则,以定义的顺序依次迭代每个元素。
  3. 迭代内容:

    • for...infor...in 循环返回的是属性名称(字符串类型),可以通过对象的属性名称访问对应的属性值。
    • for...offor...of 循环返回的是可迭代对象的值,可以直接访问每个元素的值。
  4. 支持的对象类型:

    • for...infor...in 循环适用于迭代普通对象的属性,包括原型链上的可枚举属性。
    • for...offor...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 循环不适用于普通对象,只适用于实现了迭代器接口的对象。