首页 > 其他分享 >JS中为什么forEach方法不能终止

JS中为什么forEach方法不能终止

时间:2024-03-28 14:48:22浏览次数:23  
标签:index arr const JS item forEach 终止 fn

forEach是我们在日常工作中经常使用到的方法,但是你有什么尝试使用forEach进行停止终止等操作呢?

一、走进forEach

对于forEach了解不多的,只知道它可以遍历数组,如果有这么一个操作: 一个数组[0, 1, 2, 3, 4, 5],打印出[0, 1, 2, 3],可能会这么写。

1.1 尝试return

const arr = [0, 1, 2, 3, 4, 5];
const newArr = [];

arr.forEach(item => {
	newArr.push(item);
	if (item === 3) {
		return false;
	}
})

console.log(newArr); // ???

  

打印的结果不尽人意,还是 [0, 1, 2, 3, 4, 5]。为什么会这样呢?

首先我们得出了一个结论,forEach不能通过return终止运行

1.2 尝试break

我们在尝试一下for循环中的break,看看效果会不会好一点。

const arr = [0, 1, 2, 3, 4, 5];
const newArr = [];

arr.forEach(item => {
	newArr.push(item);
	if (item === 3) {
		break; // SyntaxError: Illegal break statement
	}
})

console.log(newArr); // ???

  

结果报错了:语法错误,非法的break语句。

二、剖析forEach

对于上边的结果,我们就来看一看forEach实现原理到底是怎么样的,我猜想万变不离其宗,说到底还是for循环

2.1 forEach使用

const arr = [0, 1, 2, 3, 4, 5];

arr.forEach((item, index, arr) => {
	console.log(item, index, arr);
})

  

 遍历的三个值分别为:值、下标、调用方法的数组对象

2.2 forEach分析

我们先来看一下forEach的特点,为此我专门去MDN上看了一下,得到了以下信息:

forEach(callbackFn)

  

  1. 首先接收一个回调callbackFn,回调用三个参数(element, index, array)
    • element:数组中正在处理的当前元素;
    • index:数组中正在处理的当前元素的索引;
    • array:调用了 forEach() 的数组本身。
  2. 函数没有返回值,默认为undefined

2.3 自定义myForEach

  1. 这里我把自己定义的方法写在数组的原型上,好处就是可复用性, 根据上边得到的信息,我们需要接收一个回调函数(fn),通过for循环改变fn的this指向,具体代码如下: 下面我们来简单分析一下

Array.prototype.myForEach = function (fn) {
	for (let i = 0; i < this.length; i ++) {
		fn.call(this, this[i], i, this);
	}
}

  2. 使用一下自己写好的myForEach看一下打印的结果

const arr = [0, 1, 2, 3, 4, 5];

arr.myForEach((item, index, arr) => {
    console.log(item, index, arr);
})

 不能说完全相同只能说是一模一样

2.4 深入解析forEach

通过2.3我们可以看到我们的for循环中是一个函数执行,我们最开始的写法就是说我们的returnbreak是写在了我们的fn中。于是我们就想到了下边这种情况它可以终止吗:

const arr = [0, 1, 2, 3, 4, 5];

for (let i = 0; i < arr.length; i ++) {
    fn(arr[i], i, arr);
}

function fn (item, index, array) {
    console.log(item, index, arr);
    if (item === 3) {
        return false;
    }
}

显然这样是不可以的,所以forEach不能停止

p.s 有一种不推荐的做法是可以终止的,就是在循环体里抛出异常。

eg.

 输出

 

三、改造myForEach

题外话:我这可能属于是吃饱了没事情做,哈哈

3.1 想法

试想一下,我们能不能通过改造一下我们自己定义的myForEach方法,来达到满足我们的要求,相信聪明的你也能够想到,让for循环终止,我就简单写一下自己的想法把,我们让fn有返回值,在for循环中通过flag变量接收。

3.2 代码实现

Array.prototype.myForEach = function (fn) {
  for (let i = 0; i < this.length; i++) {
    const flag = fn.call(this, this[i], i, this);
    if (flag) {
      break
    }
  }
}

const arr = [0, 1, 2, 3, 4, 5];

arr.myForEach((item, index, array) => {
  console.log(item, index, array)
  if (item === 3) {
    return true
  }
})

 p.s jq的each就是return false中断的,都是大同小异。

四、总结

  如果一定要跳出当前循环的操作,就不要用forEach。直接用for或者是其他循环函数。

 

标签:index,arr,const,JS,item,forEach,终止,fn
From: https://www.cnblogs.com/caihongmin/p/18101631

相关文章

  • js 回调 callback
    <html><head><title>按钮点击事件示例</title><script>functiona(callback){console.log("执行函数a!");console.log("调用回调函数");callback();//调用回调函数}functionb(){console.log("回调函数b"......
  • Day52:WEB攻防-XSS跨站&反射型&存储型&DOM型&标签闭合&输入输出&JS代码解析
    目录XSS跨站-输入输出-原理&分类&闭合XSS跨站-分类测试-反射&存储&DOM反射型XSS存储型XSSDOM-base型XSS:(某案例测试)知识点:1、XSS跨站-输入输出-原理&分类&闭合2、XSS跨站-分类测试-反射&存储&DOMXSS跨站-输入输出-原理&分类&闭合漏洞原理:接受输入数据,输出显......
  • nodejs 核心模块
    nodejs核心模块Node.js的核心模块是Node.js发行版自带的模块,无需通过npm进行安装。你可以在Node.js的官方文档中找到所有核心模块的详细列表。以下是一些常用核心模块的简单使用示例:http 模块:创建一个简单的HTTP服务器。  consthttp=requir......
  • 华为OD机试 - 最多购买宝石数目(Java & JS & Python & C & C++)
    须知哈喽,本题库完全免费,收费是为了防止被爬,大家订阅专栏后可以私信联系退款。感谢支持文章目录须知题目描述输入描述输出描述解题思路:题目描述橱窗里有一排宝石,不同的宝石对应不同的价格,宝石的价格标记为gems[i]0≤i<nn=gems.length宝石可同时......
  • 「DevExpress中文教程」如何将DevExtreme JS HTML编辑器集成到WinForms应用
    在本文中我们将演示一个混合实现:如何将webUI工具集成到WinForms桌面应用程序中。具体来说,我们将把DevExtremeJavaScriptWYSIWYGHTML编辑器(作为DevExtreme UI组件套件的一部分发布的组件)集成到WindowsForms应用程序中。获取DevExtremev23.2正式版下载DevExpress技术交......
  • js的事件
    JS的事件介绍JS(JavaScript)是基于对象(Object-based)、事件驱动的脚本语言。JS事件,就是用户或浏览器本身的某种行为,一般是用户对页面的一些动作引起的,例如,单击某个链接或按钮、在文本框中输入文本、按下键盘上的某个按键、移动鼠标等等。当事件发生时,您可以使用JavaScript中的......
  • python 调用 js
    安装pyexecjspipinstallPyExecJS2使用importosimportexecjsimportexecjs.runtime_namescurrent_dir=os.path.dirname(__file__)js_abs_path=os.path.join(current_dir,"js\\index.js")'''js内容functionadd(a,b){returna+......
  • 【漏洞复现】万户 ezOFFICE wf_printnum.jsp SQL注入漏洞
    0x01产品简介万户OAezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日常工作......
  • JackJson对象转化
    当接受jsonKey首字母为大写的时候需要用JSONProperty配合JsonIngore处理packagecom.example.demoboot.dto;importcom.example.demoboot.entity.Person;importjava.util.List;/***封装response返回的data对象对象太多可以用宽对象,把所有需要的都写一起**......
  • JSP
    Jsp语法:1.      注释 静态注释:就是对静态代码的注释语法 它是由浏览器处理的也可以对XML配置文件进行注释,由服务器进行处理动态注释:就是对动态代码的注释语法<%--  --%>它是由tomcat处理的      ,也可以采用原生Java注释。2.变量  全局变量:<%!......