面试官:你可以终止 forEach 吗?

举报
yd_244540595 发表于 2024/06/25 14:51:08 2024/06/25
【摘要】 文章转载于公众号:程序员Sunday顺便吆喝一声,如果你计算机、软件工程、电子等相关专业本科及以上学历,欢迎来共事。前后端/测试​均可投,技术大厂。理解 forEachJavaScript 的forEach方法是一种流行的数组迭代工具。它为每个数组元素执行一次提供的函数。但是,与传统的for 和 while循环不同,forEach它被设计为对每个元素执行该函数,没有内置机制来提前停止或中断循...

文章转载于公众号:程序员Sunday

顺便吆喝一声,如果你计算机、软件工程、电子等相关专业本科及以上学历,欢迎来共事。

前后端/测试均可投,技术大厂。

理解 forEach

JavaScript 的forEach方法是一种流行的数组迭代工具。它为每个数组元素执行一次提供的函数。但是,与传统的for 和 while循环不同,forEach它被设计为对每个元素执行该函数,没有内置机制来提前停止或中断循环

ini复制代码
 const fruits = ["apple", "banana", "cherry"];
 fruits.forEach(function (fruit) {
    console.log(fruit); //apple banana cherry
 });
 

传统的方式无法终止 forEach

01:利用 break

forEach 的一个关键限制是无法使用传统的控制语句(如break或return)来停止或中断循环。 如果你尝试在 forEach 中使用break,您将遇到语法错误,因为break在回调函数中不适用。

ini复制代码
const numbers = [1, 2, 3, 4, 5];  
numbers.forEach(number => {  
  if (number > 3) {  
    break; //Syntax Error: Illegal break statement  
  }  
  console.log(number);  
});

02:利用 return

在其他循环或函数中,return 语句退出循环或函数,并返回一个值(如果指定)。

在 forEach 的上下文中,return 不会跳出循环。 相反,它只是退出回调函数的当前迭代并移至数组中的下一个元素。

ini复制代码
const numbers = [1, 2, 3, 4, 5];  
numbers.forEach(number => {  
  if (number === 3) {  
    return; //Exits only the current iteration  
  }  
  console.log(number); //1、2、4、5  
});

return 跳过 3 的打印,但循环继续处理剩余元素。

使用 Error 终止 forEach

虽然不建议这么使用,但从技术上讲,可以通过抛出异常来停止 forEach 循环。 这种方法虽然是非正统的,并且由于影响代码可读性和错误处理而通常建议不要这样做,但它可以有效地停止循环。

typescript复制代码
const numbers = [1, 2, 3, 4, 5];  
try {  
  numbers.forEach(number => {  
    if (number > 3) {  
      throw new Error('循环停止');  
    }  
    console.log(number);  
  });  
} catch (e) {  
  console.log('出现异常,循环已停止');  
}  
// 输出: 1, 2, 3, 出现异常,循环已停止

在此示例中,当满足条件时,将引发异常,从而提前退出 forEach 循环。 但是,需要注意,你得正确处理此类异常以避免产生意外的副作用。

使用 for...of 循环 代替 forEach

ES6 (ECMAScript 2015) 中引入的 for...of 循环提供了一种现代、干净且可读的方式来迭代可迭代对象,例如数组、字符串、映射、集合等。

与 forEach 相比,它的主要优势在于它与 Break 和 continue 等控制语句的兼容性,为循环控制提供了更大的灵活性。

typescript复制代码const numbers = [1, 2, 3, 4, 5];  
  
for (const number of numbers) {  
  if (number > 3) {  
    break; // 成功终止循环  
  }  
  console.log(number); // 1 2 3  
}

在此示例中,循环迭代numbers 数组中的每个元素。 一旦遇到大于3的数字,它就会使用break语句退出循环。 forEach 无法实现这种级别的控制。

总结

虽然 JavaScript 中的 forEach 方法提供了一种简单的数组迭代方法,但它缺乏中断或停止中循环的灵活性。

幸运的是,像 for...of 循环这样的替代方法,以及像 some() 和 every() 这样的方法,可以替代 forEach。

(完)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。