map的forEach区别

news2024/11/24 7:16:31

map的forEach区别


先总结下:

map和forEach区别是:
1.map有返回值而且必须return返回一个数组才行 ; 而forEach没有返回值可直接打印结果;
即:forEach()方法不会返回执行结果,而是undefined。也就是说,forEach()会修改原来的数组。而map()方法会得到一个新的数组并返回;

2.map因为返回数组所以可以链式操作,foreach不能;

3.map里可以用return ,而foreach里用return不起作用,foreach不能用break,会直接报错;
4. 总的来说 map 的速度大于forEach;

重要提示!!!!
①.使用map方法可以改变原数组?
当数组元素是基本数据类型时,map()方法不会改变原数组
当数组元素是引用类型时,map()方法会改变原数组!!

②.使用map方法可以改变原数组?—不会!!
map本身不会改变原数组任何属性

如果数组中的值是基本类型, 不改变;
如果是引用类型分两种情况:
1、没有修改形参元素的地址值, 只是修改形参元素内部的某些属性,会改变原数组;
(但这与map方法本身无关,map方法不会改变原数组,这属于强行访问到对象内部进行重新赋值)

2、直接修改整个元素对象时,无法改变原数组

使用场景
forEach适合于你并不打算改变数据的时候;
map()适用于你要改变数据值的时候。不仅仅在于它更快,而且返回一个新的数组。这样的优点在于你可以使用复合(composition)(map(), filter(), reduce()等组合使用);

下面直接上例子,比较两者区别:

基本数据类型:

1.map:

let arrA = [1, 2, 3];
let arrA1 = arrA.map(function (item, index, arr) {
      return item * 2;
  })
console.log(arrA, 'arrA为基本数据类型--原数组');
console.log(arrA1, 'arrA1为基本数据类型--map后的数据');


在这里插入图片描述

2.forEach:
数组包含的是基本数据类型a,那么在在使用forEach时候,形参b会在栈中拷贝一份原数组的指针与值,此时a与b是完全独立的数据,我们在修改b的值时是不会影响到a的值。

let arrA = [1, 2, 3];
let arrA2 = arrA.forEach(function (item, index, arr) {
     item = item * 2
 })
console.log(arrA, 'arrA为基本数据类型--原数组');
console.log(arrA2, 'arrA2为基本数据类型--forEach后的数据');

在这里插入图片描述
如何改变原数组中基本类型的值:
可以借助第二个参数index来改变数组

let arrA = [1, 2, 3];
let arrA2=arrA.forEach((item, index) => {
    arrA[index] = item * 2
})
console.log(arrA, 'arrA为基本数据类型--原数组');
console.log(arrA2, 'arrA2为基本数据类型--forEach后的数据');

在这里插入图片描述

引用数据类型:

1.map:

let arrB = [
   { name: 'a', age: 1 },
   { name: 'b', age: 2 },
];

let arrB1=arrB.map((item) => {
   item.age = 3;
   return item;
});

console.log(arrB, 'arrB为引用数据类型--原数组');
console.log(arrB1, 'arrB1为引用数据类型--map后的数据');;

在这里插入图片描述

原数组也变化了,怎么解决map方法导致的原数组变化的问题?
解决方法:

let arrB = [
     { name: 'a', age: 1 },
     { name: 'b', age: 2 },
 ];
  
 let arrB1=arrB.map((item) => {
     return {
         ...item,
         age:3
     };
 });

 console.log(arrB, 'arrB为引用数据类型--原数组');
 console.log(arrB1, 'arrB1为引用数据类型--map后的数据');

在这里插入图片描述

2.forEach:
数组包含的是引用数据类型a,那么在使用forEach的时候,形参b拷贝的是引用数据类型在栈中的地址,此时a和b都同时指向在一开始定义a时在堆中保存的数据,所以当我们修改b的数据,a的值也会改变,因为他们都是指向的堆中的同一数据。
(基本数据类型:栈中保存指针与值;引用数据类型:栈中保存指针,堆中保存值)

①、数组的元素是引用数据类型:(直接修改整个元素对象时,无法改变原数组)

let arrB = [
     { name: 'a', age: 1 },
     { name: 'b', age: 2 },
 ];
  
 let arrB2=arrB.forEach((item) => {
     item = {
         name: 'c',
         age: '3',
     };
 });

 console.log(arrB, 'arrB为引用数据类型--原数组');
 console.log(arrB2, 'arrB2为引用数据类型--forEach后的数据');

在这里插入图片描述

②.数组的元素是引用数据类型:(修改元素对象里的某个属性时,可以改变原数组)

let arrB = [
    { name: 'a', age: 1 },
    { name: 'b', age: 2 },
];
 
let arrB2=arrB.forEach((item) => {
    item.name = 'c';
});

console.log(arrB, 'arrB为引用数据类型--原数组');
console.log(arrB2, 'arrB2为引用数据类型--forEach后的数据');

在这里插入图片描述

參考:
https://blog.csdn.net/zhangwenok/article/details/124692883
https://blog.csdn.net/black_white_1/article/details/126710575

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

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

相关文章

vue 在线聊天实战范例(含选择发送表情、图片、视频、音频,自定义右键快捷菜单,一键复制,左右聊天气泡)

最终效果 完整代码 index.vue <template><div class"page"><div class"leftBox"><h1>访客</h1><div class"chatBox"><div class"chatRecordBox"><div v-for"(item, index) in cha…

DBCO-COOH分子量:305.3,CAS:1353016-70-2,二苯基环辛炔-羧基;类似有DBCO-NH2、SH、MAL、NHS等等

中文名称&#xff1a;二苯基环辛炔-羧基 英文名称&#xff1a;DBCO-acid 英文别称&#xff1a;DBCO-COOH cas: 1353016-70-2 分子式&#xff1a;C19H15NO3 分子量&#xff1a;305.3 DBCO-COOH是DBCO 衍生化的常用构件&#xff0c;在EDC、DCC和HATU等活化剂存在下&#xf…

linux kernel menuconfig kconfig makefile

概述 menuconfig是Linux平台用于管理代码工程、模块及功能的实用工具。 menuconfig的使用方式通常是在编译系统之前在系统源代码根目录下执行make menuconfig命令从而打开一个图形化配置界面&#xff0c;再通过对各项的值按需配置从而达到影响系统编译结果的目的。 Nuttx的me…

Spring Boot 数据库操作Druid和HikariDataSource

目录 Spring Boot 数据库操作 应用实例-需求 创建测试数据库和表 进行数据库开发&#xff0c; 在pom.xml 引入data-jdbc starter 参考官方文档 需要在pom.xml 指定导入数据库驱动 在application.yml 配置操作数据源的信息 创建bean\Furn.java 测试结果 整合Druid 到…

六、easyUI中的window(窗口)组件

1.window&#xff08;窗口&#xff09;组件的概述 窗口控件是一个浮动和可拖拽的面板&#xff0c;它可以用作应用程序窗口。默认情况下&#xff0c;窗口可以移动&#xff0c;调整大小和关闭。它的内容也可以被定义为静态HTML或要么通过Ajax动态加载 2.window&#xff08;窗口&…

MySQL-备份+日志:介质故障与数据库恢复

MySQL-备份日志&#xff1a;介质故障与数据库恢复 第1关&#xff1a;备份与恢复任务描述相关知识MySQL的恢复机制MySQL的备份与恢复工具编程要求代码参考 第2关 备份日志&#xff1a;介质故障的发生与数据库的恢复任务描述相关知识编程要求测试说明代码参考 第1关&#xff1a;备…

《分布式微服务电商源码》-项目简介

1.常见的电商模式 市面上有 5 种常见的电商模式 B2B、B2C、C2B、C2C、O2O 1.1.B2B 模式 B2B(Business to Business)&#xff0c;是指商家和商家建立的商业关系&#xff0c;如阿里巴巴. 1.2.B2C 模式 B2C(Business to Consumer) 就是我们经常看到的供应商直接把商品买个用户&a…

057:cesium设置纯颜色材质

第057个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置纯颜色的材质,颜色的表达方式可以参考这篇文章 Cesium七种方法设置颜色 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共87行)相关API参考:专…

用友BIP新零售产品发布,与零售企业共创新未来

随着数智化时代的到来&#xff0c;零售企业不断面临着更多的挑战和机遇。为了满足消费者多元化的需求&#xff0c;零售企业需要采用多种方式来提高竞争力&#xff0c;如多渠道销售、线上线下融合、数智化运营、个性化营销和无缝化体验等。用友BIP新零售为零售企业提供了数智化转…

Jenkins的持续集成与持续部署

系统总体架构 Gitlab Gitlab是一款主要用于代码管理的工具&#xff0c;相较于GitHub&#xff0c;可以自己搭建服务器&#xff0c;这可以避免因为网络速度慢导致部署效率低下&#xff0c;同时&#xff0c;自己搭建服务器&#xff0c;安全性更高。Jenkins Jenkins主要用于管理版本…

改图片分辨率:提升图像质量的关键步骤

无论您是一名摄影师、设计师&#xff0c;还是一个爱好者&#xff0c;改变图片分辨率都是必不可少的工作。在本文中&#xff0c;我们将介绍改图片分辨率的作用以及它在哪些场景下使用。 改图片分辨率介绍 图片分辨率是指图像中所包含的像素数量&#xff0c;通常以“每英寸像素…

threejs 相机OrbitControls常用方法及属性

相机控件OrbitControls 通过OrbitControls可以对三维场景进行缩放、平移、旋转&#xff0c;本质上改变的不是场景&#xff0c;而是相机的参数&#xff0c;相机的位置角度不同&#xff0c;同一个场景的渲染效果是不一样&#xff0c;比如相机围绕着一个场景旋转&#xff0c;就像…

有哪些工具软件一旦用了就离不开?

&#x1f496;前言 目前&#xff0c;随着科技的快速发展&#xff0c;电脑已经进入了许许多多人的生活 &#xff0c;在平日的学习、工作和生活里&#xff0c;我们会用的各种各样的强大软件。市面上除了某些大公司开发在强大软件&#xff0c;还有各路大神开发具有某些功能的强大…

nodejs+vue网上课程在线教学网站平台a53y0

(1) vue引入elementui 1.使用npm安装element-ui npm i element-ui -S 2.在main.js中导入使用vue import element-ui/lib/theme-chalk/index.css //别忘了导入样式 import ElementUI from element-ui Vue.use(ElementUI) 后端&#xff1a;java(springbootssm)/python/php/node…

MySQL入门到精通——运维篇(基础篇——进阶篇——运维篇)本文以MySQL8.0版本以上为例

文章目录 前言MySQL——运维篇一、日志1.日志-错误日志2.日志-二进制日志3.日志-查询日志4.日志-慢查询日志 二、主从复制1.主从复制-概述2.主从复制-原理3.主从复制-搭建3.1.主从复制-搭建-主库配置3.2.主从复制-搭建-从库配置3.2.主从复制-搭建-测试 三、分库分表1.分库分表-…

Nacos简介和安装

1.Nacos简介 1.1.为什么叫Nacos 前四个字母分别为Naming和Configuration的前两个字母&#xff0c;最后的s为Service。 1.2.是什么 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos: Dynamic Naming and Configuration ServiceNacos就是注册中心&am…

Fiddler 到底能做什么?一篇文章给你详细介绍

Fiddler是检查 Http 流量的最流行的工具之一。此工具可帮助我们非常轻松地测试 REST API / SOAP Web 请求。 题主的问题&#xff1a;Fiddler 到底能做什么。仔细思考&#xff0c;其实有两层意思&#xff1a; 第一层&#xff1a;Fiddler工具的应用范围 第二层&#xff1a;Fiddl…

手搓哈希表

手搓哈希 哈希概念哈希冲突为什么会有哈希冲突的产生?常见的哈希函数 如何解决哈希冲突&#xff1f;闭散列闭散列的简单模拟实现插入查找删除 总代码开散列开散列的模拟实现插入删除查找 存在的问题迭代器 开散列总的代码 哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码…

在研制带处理器的电子产品时,如何提高抗干扰能力和电磁兼容性?

一、下面的一些系统要特别注意抗电磁干扰 1、微控制器时钟频率特别高&#xff0c;总线周期特别快的系统。 2、系统含有大功率&#xff0c;大电流驱动电路&#xff0c;如产生火花的继电器&#xff0c;大电流开关等。 3、含微弱模拟信号电路以及高精度A/D变换电路的系统。 二、…

GPU物理位置查询:从nvidia编号到物理位置

supermicro AS -4125GS-TNRT 服务器GPU出现问题&#xff0c;有几张GPU速度较慢。需要确定其物理位置,具体流程如下&#xff1a; 1 GPU编号与BUS_ID对应关系 使用nvidia-smi即可查看&#xff0c;如下所示&#xff1a;![在这里插入图片描述](https://img-blog.csdnimg.cn/3807d…