JavaScript中什么叫深拷贝?

在 JavaScript 中,深拷贝指的是创建一个新的对象,这个新的对象与原始对象完全独立,没有任何共享的属性或者数据,它们不共享同一块内存地址。深拷贝会复制原始对象的所有属性和嵌套对象的所有属性,包括嵌套对象中的属性。这意味着,修改拷贝后的对象不会影响原始对象。

深拷贝是一种常见的数据复制方式,它通常用于避免在操作对象时修改原始对象。在 JavaScript 中,可以使用多种方法进行深拷贝,包括递归遍历对象、lodash 的 deepClone 方法、使用 JSON 序列化和反序列化等方式。

JSON 序列化

利用 JSON 序列化和反序列化实现深拷贝,具体实现步骤如下:

  1. 使用 JSON.stringify() 方法将原始对象序列化为 JSON 字符串。
  2. 使用 JSON.parse() 方法将 JSON 字符串反序列化为新对象。
function deepClone(obj) {return JSON.parse(JSON.stringify(obj));
}const profile = {name: "天行无忌",city: "深圳",
};
const newProfile = deepClone(profile);
newProfile.city = "广东深圳";
console.log(profile); // { name: '天行无忌', city: '深圳' }
console.log(newProfile); // { name: '天行无忌', city: '广东深圳' }

使用 JSON 序列化和反序列化实现深拷贝存在一些局限性

  • 无法复制函数、正则表达式等特殊对象类型。
  • 无法复制对象的循环引用,即对象中存在自己或父对象的引用。

递归遍历对象

以下是一个使用递归遍历实现深拷贝的代码:

function deepClone(obj) {if (obj === null || typeof obj !== "object") {return obj;}let result = obj.constructor();for (let key in obj) {if (obj.hasOwnProperty(key)) {result[key] = deepClone(obj[key]);}}return result;
}const profile = {name: "天行无忌",city: "深圳",
};
const newProfile = deepClone(profile);
newProfile.city = "广东深圳";
console.log(profile); // { name: '天行无忌', city: '深圳' }
console.log(newProfile); // { name: '天行无忌', city: '广东深圳' }

使用 structuredClone

原生 structuredClone() 方法使用结构化克隆算法创建给定值的深层拷贝。

结构化克隆算法用于复制复杂 JavaScript 对象的算法。通过来自 Worker 的 postMessage() 或使用 IndexedDB 存储对象时在内部使用。它通过递归输入对象来构建克隆,同时保持先前访问过的引用的映射,以避免无限遍历循环。

语法如下:

structuredClone(value)
structuredClone(value, { transfer })
  • value:被克隆的对象。可以是任何结构化克隆支持的类型。
  • transfer:为可选参数,是一个可转移对象的数组,里面的 值 并没有被克隆,而是被转移到被拷贝对象上。

返回值:返回值是原始值的深拷贝。

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

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

相关文章

【深度学习】图像自然语言描述生成

案例 6:图像自然语言描述生成(让计算机“看图说话”) 相关知识点:RNN、Attention 机制、图像和文本数据的处理 1 任务目标 1.1 任务和数据简介 ​ 本次案例将使用深度学习技术来完成图像自然语言描述生成任务,输入…

物联网实战--入门篇之(四)嵌入式-UART驱动

目录 一、串口简介 二、串口驱动设计 三、串口发送 四、串口接收处理 五、PM2.5数据接收处理 六、printf重定义 七、总结 一、串口简介 串口在单片机的开发中属于非常常用的外设,最基本的都会预留一个调试串口用来输出调试信息,串口时序这里就不谈…

代码随想录阅读笔记-二叉树【合并二叉树】

题目 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节…

HackTheBox-Machines--Wifinetic

文章目录 1 端口扫描2 测试思路3 21端口测试&权限获取4 权限提升方法一方法二: Wifinetic 测试过程 1 端口扫描 nmap -sC -sV 10.129.229.902 测试思路 目标开启了21、22、53端口,并且21端口FTP服务允许匿名登录,所以从21端口开始进行测试…

谈谈考研数学几个常见误区

25考研数学,一定一定要吃透基础,练好计算 我之所以要强调这个,是因为现在的考研数学,越来越重视基础和计算的考察,题海战术已经过时,如果想要有效的提升自己,要进行针对性的学习。我去年考研的…

又一AI工具开源!企业应该如何搭上这趟AI快车

大模型技术在近两年来飞速发展,企业对大模型的认知更加理性、务实。大模型本身不会直接产生价值,但在大模型基础架构之上开发出的AI应用,带来技术创新及业务增长,成为企业真正关心的问题。 基于大模型开发的又一个AI工具诞生&…

VMware虚拟机三种网络模式配置

vmware有三种网络工作模式:Bridged(桥接模式)、NAT(网络地址转换模式)、Host-Only(仅主机模式)。 1. 打开网络编辑器(编辑 --> 虚拟网络编辑器) 在主机上有VMware Ne…

LLMs之DBRX:DBRX的简介、安装和使用方法、案例应用之详细攻略

LLMs之DBRX:DBRX的简介、安装和使用方法、案例应用之详细攻略 导读:2024年3月27日(美国时间),DBRX是Databricks推出的一款新型开源大语言模型,主要特征和优势总结如下: >> 表现优异:DBRX在各类自然语…

vue3的mars3d点击右键出现置顶、向下、向上等选项

效果图 下载插件 imengyu/vue3-context-menu npm i imengyu/vue3-context-menu在要使用的页面中引入一下代码 import "imengyu/vue3-context-menu/lib/vue3-context-menu.css"; import ContextMenu from "imengyu/vue3-context-menu";如果是使用在树的…

课程设计项目2.2:心电信号中的QRS波监测

01.课程设计的主要内容 02.代码效果图 1.差分阈值法进行QRS波检测 2.QRS复波检测算法 获取代码请关注MATLAB科研小白的个人公众号(即文章下方二维码),并回复:MATLAB课程设计本公众号致力于解决找代码难,写代码怵。各位…

填谷式无源PFC电路

目录: 1、概述 2、原理 1、概述 如果不采用PFC,那么典型开关模式电源的功率因数约为0.6,因而会有相当大的奇次谐波失真(第三谐波有时和基本谐波一样大)。令功率因数小于1以及来自峰值负载的谐波减少了运行设备可用的实际功率。为运行这些低…

SRC实战-cookie注入漏洞

谷歌语法-信息收集 1.查找带有ID传参的网站(可以查找sql注入漏洞) inurl:asp idxx 2.查找网站后台(多数有登陆框,可以查找弱口令,暴力破解等漏洞) site:http://xxxx.com “admin” site:http://xx.com int…