ES6中的扩展运算符你真的会用吗?
本文不会具体介绍扩展运算符的基本用法。
只是分享在项目中踩坑的点。
你以为的扩展运算符只是复制的功能,其实会偷偷修改你的原数组
案例:
假如arr = [...arr2]
,修改arr
的值会改变arr2
的值吗?
解决方案:
case1
使用 arr = [...arr2]
语法创建一个新的数组 arr
,并将 arr2
中的元素复制到 arr
中。这意味着 arr
和 arr2
是不同的数组实例,它们的引用不同。因此,修改 arr
不会直接影响到 arr2
。
例如:
int[] arr2 = {1, 2, 3};
int[] arr = [...arr2];arr[0] = 10;System.out.println(Arrays.toString(arr)); // 输出:[10, 2, 3]
System.out.println(Arrays.toString(arr2)); // 输出:[1, 2, 3]
在上述示例中,将 arr2
的值复制到 arr
中后,修改 arr
的第一个元素并不会影响到 arr2
。
case2
但需要注意的是,如果数组 arr2
中的元素是对象的引用,而不是基本类型(如整数),那么 arr
和 arr2
中的元素引用将指向相同的对象。在这种情况下,修改对象本身可能会影响到两个数组。
例如:
class Person {String name;public Person(String name) {this.name = name;}
}Person[] arr2 = {new Person("Alice"), new Person("Bob")};
Person[] arr = [...arr2];arr[0].name = "Charlie";System.out.println(arr[0].name); // 输出:Charlie
System.out.println(arr2[0].name); // 输出:Charlie
在这个示例中,修改 arr
中的第一个元素的名称属性同时也会影响到 arr2
中的第一个元素,因为它们引用的是同一个 Person
对象。
总结起来,对于基本类型数组,使用 arr = [...arr2]
创建的新数组与原始数组是独立的。但对于引用类型数组,修改对象本身可能会影响到两个数组。
如果我想要创建一个与arr2相同的数组,并且修改它不会影响到arr2,应该怎么做?
要创建一个与 arr2
相同的数组,并确保修改它不会影响到 arr2
,你可以使用数组的拷贝方法来实现。以下是一些常见的方法:
可以使用 slice()
方法或扩展运算符 ([...arr2]
) 创建一个新的数组副本。
const arr2 = [1, 2, 3];
const arr = arr2.slice(); // 或者 const arr = [...arr2];arr[0] = 10;console.log(arr); // 输出:[10, 2, 3]
console.log(arr2); // 输出:[1, 2, 3]
请注意,这些方法是针对普通的数组(如整数数组)的,如果你使用的是引用类型数组,如对象数组,需要确保对象也被复制,而不仅仅是引用。在这种情况下,你可能需要使用深拷贝方法,以确保对象的属性也被复制。
综上所述,通过使用适当的数组拷贝方法,你可以创建一个与 arr2
相同的数组,并确保对它的修改不会影响到 arr2
。
拷贝一个对象数组,并且新数组改变后不要影响旧数组
如果你想要拷贝一个对象数组,并确保新数组的修改不会影响到旧数组,你需要进行深拷贝(deep copy)。深拷贝会创建一个新的数组,并逐个复制对象及其属性,而不仅仅是复制对象的引用。具体方法如下:
- JavaScript:你可以使用
JSON.parse(JSON.stringify(arr2))
进行深拷贝。
const arr2 = [{ name: 'Alice' }, { name: 'Bob' }];
const arr = JSON.parse(JSON.stringify(arr2));arr[0].name = 'Charlie';console.log(arr); // 输出:[{ name: 'Charlie' }, { name: 'Bob' }]
console.log(arr2); // 输出:[{ name: 'Alice' }, { name: 'Bob' }]
- 你可以通过遍历原数组并逐个复制对象来创建一个新的数组。
注意,深拷贝方法适用于对象数组,其中对象包含属性。如果对象中还包含其他嵌套对象或集合等,你需要相应地对嵌套对象进行深拷贝。
const arr2 = [{ name: 'Alice' }, { name: 'Bob' }];// 方法2: 使用递归进行深拷贝
function deepCopy(obj) {if (typeof obj !== 'object' || obj === null) {return obj;}let copy = Array.isArray(obj) ? [] : {};for (let key in obj) {if (obj.hasOwnProperty(key)) {copy[key] = deepCopy(obj[key]);}}return copy;
}const arr = deepCopy(arr2);arr[0].name = 'Charlie';console.log(arr); // 输出:[{ name: 'Charlie' }, { name: 'Bob' }]
console.log(arr2); // 输出:[{ name: 'Alice' }, { name: 'Bob' }]
在上述示例中,我们使用了两种方法来实现深拷贝。第一种方法使用 JSON.stringify
将对象数组转换为字符串,然后使用 JSON.parse
将字符串转换回对象数组,从而实现深拷贝。第二种方法是使用递归函数 deepCopy
对对象进行逐个属性的深拷贝。
不论你选择哪种方法,都可以创建一个与 arr2
相同的对象数组,并确保对新数组的修改不会影响到旧数组 arr2
。
相关文章:
ES6中的扩展运算符你真的会用吗?
本文不会具体介绍扩展运算符的基本用法。 只是分享在项目中踩坑的点。 你以为的扩展运算符只是复制的功能,其实会偷偷修改你的原数组 案例: 假如arr [...arr2] ,修改arr的值会改变arr2的值吗? 解决方案: case1 使用 arr […...

利用逻辑回归判断病人肺部是否发生病变
大家好,我是带我去滑雪! 判断肺部是否发生病变可以及早发现疾病、指导治疗和监测疾病进展,以及预防和促进肺部健康,定期进行肺部评估和检查对于保护肺健康、预防疾病和提高生活质量至关重要。本期将利用相关医学临床数据结合逻辑回…...

全民健康生活方式行动日,天猫健康联合三诺生物推出“15天持续测糖计划”
糖尿病是全球高发慢性病中患病人数增长最快的疾病,是导致心血管疾病、失明、肾衰竭以及截肢等重大疾病的主要病因之一。目前中国有近1.4亿成人糖尿病患者,科学的血糖监测和健康管理对于糖尿病患者来说至关重要。 在9月1日全民健康生活方式行动日前夕&am…...

设计模式行为型-状态模式
文章目录 简介状态模式基础定义状态接口或抽象类实现具体状态类 上下文类与状态转换上下文类的定义和作用状态转换及触发条件 状态模式的优势与适用性优点一:可维护的代码优点二:清晰的状态管理适用场景一:对象拥有多个状态适用场景二&#x…...

弹窗、抽屉、页面跳转区别 | web交互入门
当用户点击或触发浏览页面的某个操作,有很多web交互方式,可以大致分为弹窗、抽屉、跳转新页面三种web交互方式。虽然这三种web交互方式看起来没什么不同,但实际上弹窗、抽屉、跳转新页面对交互体验有蛮大的影响。 这需要UI\UX设计师针对不同…...

说说Flink运行模式
分析&回答 1.开发者模式 在idea中运行Flink程序的方式就是开发模式。 2.local-cluster模式 Flink中的Local-cluster(本地集群)模式,单节点运行,主要用于测试, 学习。 3.Standalone模式 独立集群模式,由Flink自身提供计算资源。 4.Yarn模式 把Fl…...

视频汇聚/视频云存储/视频监控管理平台EasyCVR新增首次登录强制修改密码
安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。视频汇聚平台既具…...

C语言控制语句——分支语句
条件语句用来根据不同的条件来执行不同的语句,C语言中常用的条件语句包括if语句和switch语句。 if 语句 语法格式: if (条件) {条件成立时,要做的事…… }案例需求: 定义一个整数变量记录年龄判断是否满 18 岁 (>…...
音视频 fmpeg命令裁剪和合并视频
一、生成测试文件 找三个不同的视频每个视频截取10秒内容 ffmpeg -i 沙海02.mp4 -ss 00:05:00 -t 10 -codec copy 1.mp4 ffmpeg -i 复仇者联盟3.mp4 -ss 00:05:00 -t 10 -codec copy 2.mp4 ffmpeg -i 红海行动.mp4 -ss 00:05:00 -t 10 -codec copy 3.mp4如果音视频格式不统一…...

机器学习基础17-基于波士顿房价(Boston House Price)数据集训练模型的整个过程讲解
机器学习是一项经验技能,实践是掌握机器学习、提高利用机器学习 解决问题的能力的有效方法之一。那么如何通过机器学习来解决问题呢? 本节将通过一个实例来一步一步地介绍一个回归问题。 本章主要介绍以下内容: 如何端到端地完成一个回归问题…...

哈希的应用——布隆过滤器
✅<1>主页::我的代码爱吃辣 📃<2>知识讲解:数据结构——位图 ☂️<3>开发环境:Visual Studio 2022 💬<4>前言:布隆过滤器是由布隆(Burton Howard Bloom&…...

LNMT的多机部署和双机热备
目录 一、环境 二、配置tomcat 三、配置nfs共享 四、配置nginx 1、两台都需要折磨配置 2、在http下面插入这两条信息 五、配置keepalived 1、安装 2、重新启动一下keepalived查看IP 六、验证双机热备 1、查看调度器备的IP,ip漂移说明keepalived生效 2、访…...

软件测试/测试开发丨Pytest和Allure报告 学习笔记
点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/26755 Pytest 命名规则 类型规则文件test_开头 或者 _test 结尾类Test 开头方法/函数test_开头注意:测试类中不可以添加__init__构造函数 注…...

十七、命令模式
一、什么是命令模式 命令(Command)模式的定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。 命令…...
服务器安装 anaconda 及 conda: command not found [解决方案]
[解决方案] conda: command not found Anaconda3 安装conda: command not found Anaconda3 安装 由于连接的服务器,无法直接在anaconda官网上下载安装文件,所以使用如下方法: wget https://repo.anaconda.com/archive/Anaconda3-2023.03-Li…...

自动驾驶和辅助驾驶系统的概念性架构(二)
摘要: 本篇为第二部分主要介绍底层计算单元、示例工作负载 前言 本文档参考自动驾驶计算联盟(Autonomous Vehicle Computing Consortium)关于自动驾驶和辅助驾驶计算系统的概念系统架构。该架构旨在与SAE L1-L5级别的自动驾驶保持一致。本文主要介绍包括功能模块图…...

【c++】VC编译出的版本,发布版本如何使用
目录 使用release类型进行发布 应用程序无法正常启动 0xc000007b 版本对应 vcruntime140d 应用版本 参考文章 使用release类型进行发布 应用程序无法正常启动 0xc000007b "应用程序无法正常启动 0xc000007b" 错误通常是一个 Windows 应用程序错误…...

自然语言处理(五):子词嵌入(fastText模型)
子词嵌入 在英语中,“helps”“helped”和“helping”等单词都是同一个词“help”的变形形式。“dog”和“dogs”之间的关系与“cat”和“cats”之间的关系相同,“boy”和“boyfriend”之间的关系与“girl”和“girlfriend”之间的关系相同。在法语和西…...

Zabbix“专家坐诊”第202期问答汇总
问题一 Q:请问一下 zabbix 里面怎么能创建出和sh文件有关联的监控项? A: 1.使用 Zabbix Agent 主动模式:如果你在目标主机上安装了 Zabbix Agent,并且想要监控与 sh 文件相关的指标,可以创建一个自定义的…...

【c语言】输出n行按如下规律排列的数
题述:输出n行按如下规律排列的数 输入: 4(应该指的是n) 输出: 思路: 利用下标的规律求解,考察数组下标的灵活应用,我们可以看出数从1开始是斜着往下放的,那么我们如何利用两层for循环求解这道题ÿ…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...

倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...