js中forEach和map的区别:forEach不会改变原数组,而map会改变数组?错了错了

news2025/4/9 14:16:07

1.提出思考?forEach不会改变原数组,而map会改变数组?

看到掘金上一篇文章觉得很有意思:大致是描述一般面试官问js中forEach和map的区别?都会回答forEach不会改变原数组,而map会改变,我也一直对百度来的答案当作参考答案。事实证明这个答案是错的

面试:问js的forEach和map的区别 - 掘金

2.forEach()没有返回值,如果使用return会返回undefined;map会返回新数组

 

 3.数组中数据为基本数据类型时,forEach和map都不会改变原数组

// 1、数组为基本数据类型时,forEach和map都不会改变原数组;使用return 返回时,forEach返回undefined,map返回一个处理后的新数组
        let arr = [1, 2, 3, 4, 5];
        let arrforEach = arr.forEach((item) => {
            return item * 2;
        });
        console.log(arr);//[1, 2, 3, 4, 5]
        console.log(arrforEach);//undefined

        let arr1 = [1, 2, 3, 4, 5];
        let arrMap = arr1.map(item => {
            return item * 2;
        });
        console.log(arr1);// [1, 2, 3, 4, 5]
        console.log(arrMap);// [2, 4, 6, 8, 10]

4.数据为引用数据类型时,map和forEach都会改变原数组

在使用 forEach 和 map 方法时,对引用类型元素的修改会直接反映在原始数组中。这是因为引用类型的元素实际上存储的是引用(内存地址),而非值本身。因此,通过引用可以访问和修改原始数组中的元素。而number,string,Boolean,null,undefined它们在栈内存中直接存储变量与值

// 2、数组为引用数据类型时,forEach和map都会改变原数组上的对象;使用return时,forEach返回undefined,map返回处理后的数据,未返回的元素返回undefined
        // 这是因为在使用 forEach 和 map 方法时,对引用类型元素的修改会直接反映在原始数组中。这是因为引用类型的元素实际上存储的是引用(内存地址),而非值本身。因此,通过引用可以访问和修改原始数组中的元素。
        // 而number,string,Boolean,null,undefined它们在栈内存中直接存储变量与值

        let arrObj1 = [{
            username: 'lmf',
            age: 20
        },
        {
            username: 'yl',
            age: 30
        }];
        let arrObj1ForEach = arrObj1.forEach(item => {
            if (item.username === 'lmf') return item.age = 100;
        });
        console.log(arrObj1);//{username: 'lmf', age: 100} , {username: 'yl', age: 30}
        console.log(arrObj1ForEach);//undefined


        let arrObj2 = [{
            username: 'lmf',
            age: 50
        },
        {
            username: 'yl',
            age: 60
        }];
        let arrObj2Map = arrObj2.map(item => {
            if (item.username === 'lmf') return item.age = 200;
        });
        console.log(arrObj2);//{username: 'lmf', age: 200} , {username: 'yl', age: 60}
        console.log(arrObj2Map);// [200, undefined]

5.map和forEach循环体内return时影响

return本身就是表示跳出本次循环,进入下次循环。博主说的观点“foreach可以跳出本次循环,return 语句可以在当前回调函数中返回,而map不能,只能遍历完整个数组。”这句话有歧义。

如下例:

其实无论是forEach还是map在return以后本次循环体中,return后的语句都不会执行。sum1和sum2都打印12,区别还是在于return后,map返回新数组的值由return的值决定,而forEach永远只会返回undefined。

  • 如果有return且直接return会返回undefined,如果返回其他值会返回其值;
  • 而forEach返回值永远会返回undefined
// 3、(错误)foreach可以跳出本次循环,return 语句可以在当前回调函数中返回,而map不能,只能遍历完整个数组。
        // return其实就是跳出本次循环,进行下次循环,区别其实和前面一样的,都是对最后返回的新数组产生影响,如果都定义sum在循环里操作,返回值都会相等
        const array1 = [1, 2, 3, 4, 5];
        let sum1 = 0;
        array1.forEach((element) => {
            if (element === 3) {
                return;//这句后面的代码此次循环都不会执行,所以对sum1不会有影响,如果返回'23',那么返回的新数组此元素也会返回'23'
            }
            console.log(element); //1,2,4,5
            sum1 += element;
        });
     console.log(newArray1);//undefined
        console.log(sum1); // 输出: 12
        console.log("2222222");

        const array2 = [1, 2, 3, 4, 5];
        let sum2 = 0;
        const newArray = array2.map((element) => {
            if (element === 3) {
                return;这句后面的代码此次循环都不会执行,所以对sum2不会有影响
            }
            console.log(element);// 1,2,4,5
            sum2 += element;
            return element * 2;
        });
        console.log(sum2);// 12
        console.log(newArray); // 输出: [2, 4, undefined, 8, 10]

6.map 方法支持链式调用;forEach不支持因为返回的是undefined

        const array3 = [1, 2, 3, 4, 5];
        const doubledSum = array3
            .map((element) => element * 2)
            .reduce((accumulator, currentValue) => accumulator + currentValue, 0);
        console.log(doubledSum); // 输出: 30

7.总结

forEach区别:

  1. forEach无返回值,具体得说是return会返回undefined;map会返回新数组
  2. 数组类型为基本数据类型时,forEach()和map()都不会改变原数组;
  3. 数组类型为引用数据类型时,forEach()和map()都会改变原数组;
  4. 循环体中使用return时,return后的代码都不会执行,只会对循环后的返回值有影响,forEach永远返回undefined,map()会返回return的值;
  5. forEach()不支持链式操作;map()支持链式操作;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/946229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

理虚实一体化全栈全场景云计算应用实训室解决方案

一、 云计算应用统概述 云计算应用系统是指基于云计算技术构建的应用系统,它将软件、数据、计算和存储资源部署在云服务器上,通过网络根据应用按照一定策略为用户提供相关服务。云计算应用系统广泛应用于各个领域,包括但不限于金融、教育、政…

buildAdmin的使用笔记

安装buildAdmin 下载完整包,解压进入 buildadmin 的文件夹, 输入命令 composer install 启动的时候使用, php think run 就可以了 为什么启动只需要, php think run 这种启动方式, 我是头一回看见 ,后来才…

数据结构:单向循环链表

单向循环链表和单向链表差不多,只需要记录头节点的位置把单向链表判断NULL的地方改为判断头节点即可 dxxhlb.h dxxhlb.cmain.c 结果

五、多表查询-4.4子查询-行子查询

一、概述 子查询返回的结果是一行&#xff08;可以是多列&#xff09;&#xff0c;这种子查询称为行子查询。 常用的操作符&#xff1a;、<>、in、not in 二、演示 【例】查询与“张无忌”的薪资及直属领导相同的员工信息 1、查询张无忌的薪资和直属领导 返回的结果是…

Android Activity启动过程一:从Intent到Activity创建

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、概览二、应用内启动源码流程 (startActivity)2.1 startActivit…

Windows 在 Hyper-V 上 安装Win11系统

文章目录 一、Hyper-V 介绍1. Hyper-V 简介2. 系统要求3. 启动 Hyper-V方式1&#xff1a;通过 PowerShell 启动方式2&#xff1a;通过设置启动 二、安装Win11虚拟机1. 在搜索栏搜索并打开Hyper-V 管理器2. 快速创建 或 新建>虚拟机3. 创建虚拟机4. 编辑设置5. 启动虚拟机6. …

华为云云服务器评测|华为云云耀云服务器L实例使用教学

文章目录 教学小故事 教学 华为云云耀云服务器L实例是一款提供高效、可靠、安全的基础设施服务的云服务器。下面是使用教学&#xff1a; 登录华为云官网。 测评产品链接&#xff1a;https://www.huaweicloud.com/product/hecs-light.html 进入云耀云服务器管理控制台&#xf…

机器学习笔记之核函数再回首:Nadarya-Watson核回归python手写示例

机器学习笔记之核函数再回首——Nadaraya-Watson核回归手写示例 引言回顾&#xff1a; Nadaraya-Watson \text{Nadaraya-Watson} Nadaraya-Watson核回归通过核函数描述样本之间的关联关系使用 Softmax \text{Softmax} Softmax函数对权重进行划分将权重与相应标签执行加权运算 N…

CVE-2023-38831 WinRAR 逻辑漏洞原因分析

简介 漏洞编号&#xff1a;CVE-2023-38831漏洞类型&#xff1a;逻辑漏洞软件名称&#xff1a;RARLAB WinRAR模块名称&#xff1a;WinRAR.exe历史漏洞&#xff1a;根据 vuldb 显示&#xff0c;历史漏洞并不是很多&#xff0c;能稳定利用的更是少之又少 CISA 已知漏洞利用目录中…

【pyqt5界面化开发-3】工具图标设置

一、目标1&#xff1a;添加icon图标 需要模块&#xff1a;from PyQt5.QtGui import QIcon w.setWindowIcon(QIcon(C:\\img_path\\test.png)) 代码(自己加上自己的图标路劲)&#xff1a; import sysfrom PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QApplication,…

基于Web的旅游推荐网站设计与实现(论文+源码)_kaic

【摘 要】 当前&#xff0c;众所周知的旅游产业已慢慢成为全世界经济领域中最具代表影响力和最大领域的产业之一&#xff0c;互联网的蓬勃发展也为旅游业带来了新的机遇。并且旅游网站已经逐渐成为管理旅游信息的主要模式。因此&#xff0c;开发一个稳定性良好、可用性强的旅游…

串口联网通信数据监听视监控侦测协议规约破解方案

作为物联网数据采集解决方案专业提供商,数采物联网小编daq-iot 在这里做以下内容介绍,并诚挚的欢迎大家讨论和交流。 本方案主要用于监听和侦测 串口通信数据报文&#xff0c;主要用于协议报文分析 破解领域。 例如破解摄像头控制道闸开启的命令等。 监控和分析通信数据代表的含…

常用的Splunk命令

查看版本 splunk version 状态、启动、停止、重启 splunk status|start|stop|restart 关闭/开启splunk服务 net stop splunkd net start splunkd 查看管理端口 splunk show splunkd_port 查看web端口 splunk show web_port 更改端口 splunk set web_port 7897 查看监听 s…

leetcode 42. 接雨水

2023.8.29 本题可以用双指针做&#xff0c;求出每一列能盛的雨水&#xff0c;再相加即可。不过暴力法会超时&#xff0c;需要优化。 双指针&#xff08;暴力&#xff09;&#xff1a; class Solution { public:int trap(vector<int>& height) {int ans 0;for(int …

加强版python连接飞书通知——本地电脑PC端通过网页链接打开本地已安装软件(调用注册表形式,以漏洞扫描工具AppScan为例)

前言 如果你想要通过超链接来打开本地应用,那么你首先你需要将你的应用添入windows注册表中(这样网页就可以通过指定代号来调用程序),由于安全性的原因所以网页无法直接通过输入绝对路径来调用本地文件。 一、通过创建reg文件自动配置注册表 创建文本文档,使用记事本打开…

ssm削面快餐店点餐服务系统源码和论文

ssm削面快餐店点餐服务系统源码和论文080 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 随着互联网技术的快速发展&#xff0c;网络时代的到来&#xff0c;网络信息也将会改变当今社会。各行各业在日常企业经…

Python+win32gui将Excel文件xlsx批量快速转换xls(附完整代码+全注释)

&#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&#x1f308; 博客主页&#xff1a;一晌小贪欢的博客主页 &#x1f44d; 该系列文章专栏&#xff1a;Python办公自动化专栏 文章作者技术和水平有限&#xff0c…

【第四阶段】kotlin语言的解构语法过滤元素

1.list集合的解构操作 package Stage4fun main() {val list listOf("java","kotlin","c")//元素解构var(v1,v2,v3)listprint("v1$v1,v2$v2,v3$v3") }执行结果 2.将上述代码转化为Java代码 使用Java 代码需要大量书写 3.解构过滤元…

RTSP/Onvif视频服务器EasyNVR安防视频平台服务器频繁重启的问题解决方案

EasyNVR平台优秀的视频能力在于通过RTSP/ONVIF协议&#xff0c;将前端接入设备的音视频资源进行采集&#xff0c;并转码成适合全平台、全终端分发的视频流格式&#xff0c;包括RTSP、RTMP、FLV、HLS、WebRTC等格式。平台可拓展性强、部署轻快&#xff0c;在安防监控领域有着广泛…