当前位置: 首页 > news >正文

JS用forEach遍历数组时无法用return退出

问题场景

遍历数组查找某个特殊值,找到时退出循环并返回所需字段。

问题写法在这里插入图片描述

调试发现计算属性output并没有返回期望的内容。于是思考原因在哪儿,可能有几种:1.没找到(经过确认数据是有的),2.没返回(就是这个)

解决方案

有以下几种,网上很多用法指导文章,此处不做详细介绍

  1. 使用for循环提到,for-in / for-of视情况而定
  2. 使用js自带的数组操作api,some(),every(), map()等,注意不同api的返回值结构
  3. try-catch捕获异常,匹配时抛出异常即可

分析

为什么forEach方法无法用break/return退出? 要弄明白这个问题首先得知道js中forEach的实现原理。
从官方的使用指导文档中,可以看到以下内容:

Array.prototype.forEach()的定义

forEach() 方法对数组的每个元素执行一次给定的函数。

forEach的使用语法

arr.forEach(callback(currentValue [, index [, array]])[, thisArg])

参数

  1. callback
    为数组中每个元素执行的函数,该函数接收一至三个参数:
    • currentValue
      数组中正在处理的当前元素。
    • index 可选
      数组中正在处理的当前元素的索引。
    • array 可选
      forEach() 方法正在操作的数组。
  2. thisArg 可选
    可选参数。当执行回调函数 callback 时,用作 this 的值

实现原理

通过以上内容可以看出,forEach的实现思路是使用了函数的特性,向forEach传入一个回调函数,然后遍历数组的时候每次都执行一次该回调函数。

尝试重写

了解实现原理后我们可以尝试自己重写该方法

const myForEach = function(arr, cb) {
	for(let i=0; i < arr.length; i++) {
		cb(arr[i], i)
	}
}

function cb(item, index) {
	console.log(item, index)
}

myForEach([1, 2, 3], cb);

这里我们传入参数里还有数组,如果是对Array原型方法的重写覆盖,则不需要传入该数组,数组会自动进入this上下文

break无效

break只能用来跳出循环,但是我们使用forEach时通常是把代码写在回调函数里,break用于跳出回调函数时会报错,所以无法跳出外层的forEach循环

return无效

return可以跳出函数,但是只能跳出当前函数,所以在forEach中***return只能跳出当前这一次的回调函数,仍然在for循环中,而无法跳出forEach函数***,所以回调函数外的for循环会继续执行下去。

相关文章:

  • Element——el-table给所有的row和column数据加上索引
  • 使用ElementUI开发的情况下,多使用Layout布局
  • Element——el-table单元格无法设置外边距,只能通过border-width实现间隔效果
  • 分支开发模式Git常用操作
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • Vue——子组件中引入父组件
  • Vue——$attrs和$listeners
  • JS代码优化技巧——持续更新
  • 文字居于div底部的方式
  • Element——el-table设置单元格间距
  • Vue——插槽语法
  • Element——给el-table表头添加*
  • Element——tooltip无效和自定义内容
  • Vue——provide/inject的使用
  • windows注册表自定义添加右键菜单
  • 5、React组件事件详解
  • fetch 从初识到应用
  • JS+CSS实现数字滚动
  • Kibana配置logstash,报表一体化
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • nodejs调试方法
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Vue学习第二天
  • Web标准制定过程
  • 给github项目添加CI badge
  • 关于字符编码你应该知道的事情
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 前端面试总结(at, md)
  • 如何设计一个微型分布式架构?
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 微信支付JSAPI,实测!终极方案
  • ​Java并发新构件之Exchanger
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (2020)Java后端开发----(面试题和笔试题)
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (三)c52学习之旅-点亮LED灯
  • (四)图像的%2线性拉伸
  • (一)VirtualBox安装增强功能
  • (转)创业的注意事项
  • .cfg\.dat\.mak(持续补充)
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .Net Winform开发笔记(一)
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • :如何用SQL脚本保存存储过程返回的结果集
  • [17]JAVAEE-HTTP协议
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [C#] 如何调用Python脚本程序
  • [FT]chatglm2微调
  • [HackMyVM]靶场Boxing