js 深拷贝和浅拷贝的理解

server/2024/9/23 20:21:09/

在 JavaScript 中,深拷贝和浅拷贝是两种处理对象复制的方式,它们的主要区别在于复制对象时如何处理对象的属性。特别是当对象的属性还引用其他对象(如数组、对象等)时,两者的行为会有显著的不同。

浅拷贝(Shallow Copy)

浅拷贝只复制对象的顶层属性和值。如果对象的属性值是一个对象或数组,那么复制的是这个对象或数组的引用,而不是实际的对象或数组本身。因此,原始对象和复制后的对象会共享这些内部对象的引用。这意味着,如果你修改了其中一个对象中的内部对象,那么另一个对象中的相应内部对象也会被修改,因为它们实际上是同一个对象。

在 JavaScript 中,你可以使用 Object.assign() 方法或者展开运算符(...)来进行浅拷贝。

深拷贝(Deep Copy)

深拷贝会递归地复制对象及其所有属性,包括嵌套的对象和数组。这意味着,原始对象和复制后的对象将完全独立,对其中一个对象的修改不会影响另一个对象。因为深拷贝创建了新的对象和数组实例,所以原始对象和复制后的对象不再共享任何内部对象。

在 JavaScript 中,没有内置的直接进行深拷贝的方法。通常,你需要使用诸如 JSON.parse(JSON.stringify(obj)) 这样的技巧,或者使用第三方库(如 lodash 的 _.cloneDeep() 方法)来实现深拷贝。但请注意,JSON.parse(JSON.stringify(obj)) 这种方法有一些局限性,例如它不能正确处理函数和循环引用,且会丢失对象的某些属性(如 undefinedSymbolfunction 等类型的属性以及对象的原型链)。

总的来说,深拷贝和浅拷贝的主要区别在于它们处理对象内部引用的方式。在选择使用哪种方式时,你需要根据你的具体需求来决定。如果你只需要复制对象的顶层属性,并且不关心这些属性是否引用了其他对象,那么浅拷贝可能就足够了。但如果你需要确保原始对象和复制后的对象完全独立,那么你应该使用深拷贝。


http://www.ppmy.cn/server/15380.html

相关文章

苹果开发者 D-U-N-S 编号申请 经历 记录

首先查询需要注册的公司是否有D-U-N-S码 (如果之前该公司上架了苹果的app,那一定有的,直接查询就可以使用) 查询地址:Sign In - Apple 输入公司的相关信息后并没有找到。。 滑动到最下面之后,可以根据当前填写的内容进行提交申请…

MySQL从安装、配置到日常操作和管理的关键步骤

MySQL是一款广泛使用的开源关系型数据库管理系统,用于存储、管理、检索和处理数据。以下是一个详细的MySQL使用教程,包括安装、基本操作、数据管理、权限控制、备份与恢复等方面的内容: 一、MySQL安装 下载: 访问MySQL官方网站&a…

基于ChatGPT打造安全脚本工具流程

前言 以前想要打造一款自己的工具,想法挺好实际上是难以实现,第一不懂代码的构造,只有一些工具脚本构造思路,第二总是像重复造轮子这种繁琐枯燥工作,抄抄改改搞不清楚逻辑,想打造一款符合自己工作的自定义的…

使用Go语言和chromedp库下载Instagram图片:简易指南

摘要/导言 本文将介绍如何使用Go语言配合chromedp库来下载Instagram上的图片。我们将通过一个简单的示例来展示整个过程,包括如何设置爬虫代理IP以绕过网络限制。 背景/引言 在数据采集和自动化测试领域,Go语言以其出色的执行效率、简洁的语法和卓越的…

carrier开利触摸屏ICVC控制面板维修CEPL130445

开利离心机19XR空调ICVC显示面板维修CEPL130445-03-R/04-R/02-R 人机界面触摸维修故障有:花屏、白屏、按触摸屏无反应或反应慢(触摸不好)、内容错乱、无背光、背光暗、有背光无字符、不能通信、按键无反应等(可更换液晶屏)黑屏、对触摸屏触摸…

PostgreSQL 排查链接锁问题常用SQL语句

目录 1. 背景 2. 常用SQL语句 2.1. 查询PostgreSQL设置的最大连接数 2.2. 查询当前使用中的连接数 2.3. 查询当前所有连接数据库用户和用户其连接数 2.4. 查询是否存在锁表记录 2.5. 查询详细的锁信息 2.6. 如何解锁? 2.6.1. 定位并终止阻赛的事务 2.6.1.…

软件测试面试题(二)

Web 测试.web 测试描述用浏览器访问 www.baidu.com 的过程以京东首页为例,设计用例框架。(注意框架设计逻辑,区域划分,专项测试等,不需 要详细用例,需要查看 PC 可直接和辨识管提要求)如何测试购…

vscode 如何断点调试ros1工程

在vscode中断点调试ros1工程主要分为以下几步: 1. 第一步就是修改cmakelist.txt,到调试模式。 将CMAKE_BUILD_TYPE原来对应的代码注释掉,原来的一般都不是调试模式。加上下面一行代码,意思是设置调试模式。 # 断点调试 SET(CMAK…