js中的浅拷贝和深拷贝

浅拷贝Shallow Copy

浅拷贝只复制对象的顶层属性及其引用,而不复制这些引用所指向的对象。如果原始对象中的某个属性是一个对象或数组,那么浅拷贝后的对象将包含对这个内部对象或数组的引用,而不是这个对象或数组的一个新副本。

let obj1 = {  a: 1,  b: {  c: 2  }  
};  // 使用扩展运算符(...)进行浅拷贝  
let obj2 = { ...obj1 };  // 或者使用 Object.assign() 方法进行浅拷贝  
// let obj2 = Object.assign({}, obj1);  console.log(obj2); // { a: 1, b: { c: 2 } }  // 修改 obj2 的顶层属性 a  
obj2.a = 2;  
console.log(obj1.a); // 1,obj1 的 a 属性没有被修改  // 修改 obj2 的 b 属性(这是一个对象的引用)  
obj2.b.c = 3;  
console.log(obj1.b.c); // 3,obj1 的 b.c 属性也被修改了,因为 obj1 和 obj2 的 b 属性指向同一个对象

深拷贝

深拷贝会复制对象及其所有子对象,直到最底层的基本数据类型。这意味着深拷贝后的对象与原始对象是完全独立的,修改其中一个对象不会影响另一个对象。

let obj1 = {  a: 1,  b: {  c: 2  }  
};  // 使用 JSON 方法进行深拷贝(注意:这种方法有局限性)  
let obj2 = JSON.parse(JSON.stringify(obj1));  // 或者使用 lodash 的 _.cloneDeep() 方法进行深拷贝  
// let _ = require('lodash');  
// let obj2 = _.cloneDeep(obj1);  console.log(obj2); // { a: 1, b: { c: 2 } }  // 修改 obj2 的顶层属性 a  
obj2.a = 2;  
console.log(obj1.a); // 1,obj1 的 a 属性没有被修改  // 修改 obj2 的 b 属性(虽然它们看起来相同,但实际上是两个独立的对象)  
obj2.b.c = 3;  
console.log(obj1.b.c); // 2,obj1 的 b.c 属性没有被修改,因为 obj1 和 obj2 的 b 属性指向不同的对象

总结

浅拷贝就是复制对象的顶层属性即第一层属性,而深拷贝是复制对象的所有属性。所以浅拷贝修改第二层及以后属性时,也还是会影响原对象。深拷贝完全不被影响。

使用浅拷贝
// 使用扩展运算符(...)进行浅拷贝  
let obj2 = { ...obj1 };  // 或者使用 Object.assign() 方法进行浅拷贝  
let obj2 = Object.assign({}, obj1);  
使用深拷贝
// 使用 JSON 方法进行深拷贝(注意:这种方法有局限性)  
let obj2 = JSON.parse(JSON.stringify(obj1));  // 或者使用 lodash 的 _.cloneDeep() 方法进行深拷贝  
let _ = require('lodash');  
let obj2 = _.cloneDeep(obj1);  

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

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

相关文章

【Mac】XnViewMP for Mac(图片浏览查看器)及同类型软件介绍

软件介绍 XnViewMP 是一款多功能、跨平台的图像查看和管理软件,适用于 macOS、Windows 和 Linux 系统。它是经典 XnView 软件的增强版本,更加现代化且功能更强大。XnViewMP 支持数百种图像格式,并提供多种图像处理工具,使其成为摄…

【摄像头标定】使用kalibr进行双目摄像头标定(ros1、ros2)

使用kalibr进行双目摄像头标定 前言标定板标定①板端准备和录制②上位机准备和标定 前言 本文不是纯用ros1进行标定,需要ros1和ros2通信。给使用ros2进行开发,但又想用kalibr标定双目摄像头的小伙伴一个教程。本文双目摄像头的数据发布使用ros2&#xf…

认识Unity中的音效

一、Audio Clip:音频片段 一个AudioClip对象存储了一段声音,可用于播放音效、背景音乐和语音对白等 ambisonic参数指示该音频片段是否是立体混响声 二、Audio Source:音源 用于在场景中播放AudioClip ——相当于发出声音的物体或设备。…

网络安全实战,潜伏与Python反向连接

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程: Python网络安全项目开发实战_潜伏与Python反向连接_编程案例解析实例详解课程教程.pdf 在网络安全领域,潜伏与反向连接技术常被黑客用于绕过防火墙和…

收银系统源码-千呼新零售2.0【线上营销】

千呼新零售2.0系统是零售行业连锁店一体化收银系统,包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体,线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看&a…

Js逆向爬虫基础篇

这里写自定义目录标题 逆向技巧断点一 、请求入口定位1. 关键字搜索2. 请求堆栈3. hook4. JSON.stringify 二、响应入口定位:1. 关键字搜索2. hook3. JSON.parse 逆向技巧 断点 普通断点 条件断点 日志断点 XHR断点 一 、请求入口定位 1. 关键字搜索 key关…

办公软件的答案?ONLYOFFICE 桌面应用编辑器会是最好用的 Office 软件?ONLYOFFICE 桌面编辑器使用初体验

文章目录 📋前言🎯什么是 ONLYOFFICE🎯 主要功能介绍及 8.1 新功能体验🎯 在线体验📝最后 📋前言 提到办公软件,大家最常用的可能就是微软的 Microsoft Office 和国产的 WPS Office。这两款软件…

jenkins环境搭建--关于jenkins在Ubuntu下的安装篇(一)

在ubuntu下使用命令进行下载安装包: 关于jenkins的安装有多种,可以借助docker容器进行安装,也可以通过传统方法手动一步步的进行安装,以下介绍手动一步步的安装方法,后续我们将解释关于jenkins的相关配置以及实战使用…

【系统架构师】-论文-微服务设计

1、摘要: 2017年10月,我被任命为系统架构师参与了XXX 运营商AOP 系统架构升级项目,负责架构设计工作,该系统是运营商面向互联网销售产品的系统,自从年中上线流量包订购业务以来,系统订单量飞速上涨,月末订单…

Pytorch-ResNet-50 网络表情识别项目(深度学习)

ResNet-50 网络表情识别 1. 导入依赖库2. 加载中文字体文件3. 设置图像尺寸和训练参数4. 数据增强和预处理5. 加载数据集6. 检查数据维度7. 定义ResNet50模型8. 初始化模型、损失函数和优化器9. 训练和测试函数10. 训练和测试模型11. 保存模型12. 评估数据保存和可视化 原码 本…

欧盟指控苹果应用商店规则非法压制竞争,面临巨额罚款风险

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Excel 宏录制与VBA编程 —— 14、使用VBA处理Excel事件

简介 若希望特定事件处理程序在触发特定事件时运行,可以为 Application 对象编写事件处理程序。 Application 对象的事件处理程序是全局的,这意味着只要 Microsoft Excel 处于打开状态,事件处理程序将在发生相应的事件时运行,而不…

计算机网络 交换机的基本配置

一、理论知识 1.三种模式: ①用户模式:当登录路由器后,系统自动进入用户EXEC命令模式。 例如: Router> 在用户模式状态下,用户只能查看路由器的连接状态和基本信息,访问其他网络和主机&#xff0c…

Dubbo 中查看动态生成的 class 文件

我们知道,在 Dubbo 框架中,对外发布服务时,会把每个服务提供者的实现类通过 Javassist 包装为一个 Wrapper 类,以减少反射调用开销。这个 Wrapper 是动态生成的,默认是不输出 class 文件的,如果想查看生成的…

数据库管理与数据库语句

数据库用户管理及高级sql语句 数据库管理 数据库用户管理 mysql权限表 在mysql中mysql库中的user表是最重要的权限表,记录允许连接到服务器的账号信息以及全局权限, 在mysql库中db和host表也是重要的权限表 db表中存储了用户对某个数据库的操作权限&…

Hyper-V 简介

Hyper-V 是微软开发的一种虚拟化技术,它允许在单个物理服务器上创建和运行多个虚拟机(VM),每个虚拟机都可以运行不同的操作系统和应用程序。Hyper-V 技术是 Windows Server 的一部分,并且也作为独立产品 Microsoft Hyp…

DataGrip 2024 mac/win版:让数据库管理更简单

JetBrains DataGrip 2024 是一款专为数据库开发者设计的集成开发环境(IDE),它凭借其卓越的性能和丰富的功能,为数据库管理提供了前所未有的便利。 DataGrip 2024 mac/win版获取 DataGrip 2024 支持几乎所有主流的关系型数据库管理系统,如 My…

一个角阀引起的思考和启示

给大家说一说,遇到的这个情况很有可能在你家也会出现。      发现马桶角阀处滴水,当时也没在意,擦干了几次之后,发现还是在滴,看了一下软管是新的,应该不会漏水,那就是角阀出问题了。    …

浅谈目标检测之YOLO(You Only Look Once)v1

简介:本文章要介绍的YOLOv1算法,它与之前的目标检测算法如R-CNN等不同,R-NN等目标检测算法是一种两阶段(two-stage)算法,步骤为先在图片上生成候选框,然后利用分类器对这些候选框进行逐一的判断…

记录一下MATLAB优化器出现的问题和解决

今天MATLAB优化器出了点问题。我想了想,决定解决一下,不然后面项目没有办法进行下去。 我忘了截图了。 具体来说,是出现了下面的问题。 Gurobi: Cplex: 在上次为了强化学习调整了Pytoch环境以后(不知道是不是这个原因&#…