js中的cloneDeep是什么?

`cloneDeep` 是 JavaScript 中用于进行**深拷贝**(deep clone)的一种方法,它会递归地复制一个对象或数组中的所有嵌套属性。深拷贝与浅拷贝(shallow copy)不同,深拷贝会完整复制对象的所有层级,包括嵌套的对象或数组,而浅拷贝只复制最外层的引用。

在 JavaScript 中,原始数据类型(如字符串、数字、布尔值等)拷贝时会直接复制其值,而对于对象或数组这样的复杂类型,默认情况下只复制其引用。因此,修改浅拷贝后的对象会影响原始对象。而深拷贝能确保完全独立的复制,即使修改拷贝后的对象,也不会影响原始对象。

### `cloneDeep` 的功能:

1. **深度复制**:递归地拷贝对象或数组,保证所有嵌套结构都被完整复制。
2. **独立性**:拷贝的结果与原始对象完全独立,修改新对象不会影响原对象。

### 常见用法:

`cloneDeep` 通常可以在库如 Lodash 中找到,也可以通过自定义实现。下面是使用 Lodash 库中的 `cloneDeep` 的例子:#### Lodash 的 `cloneDeep` 示例:


// 先引入 Lodash 库
const _ = require('lodash');// 定义一个对象
const obj = {name: 'Alice',age: 25,skills: ['JavaScript', 'React'],address: {city: 'New York',zip: 10001}
};// 使用 cloneDeep 进行深拷贝
const clonedObj = _.cloneDeep(obj);// 修改深拷贝后的对象
clonedObj.name = 'Bob';
clonedObj.address.city = 'Los Angeles';// 原始对象不受影响
console.log(obj.name); // 'Alice'
console.log(obj.address.city); // 'New York'console.log(clonedObj.name); // 'Bob'
console.log(clonedObj.address.city); // 'Los Angeles'

### 浅拷贝 vs 深拷贝
- **浅拷贝**(如使用 `Object.assign` 或展开运算符 `...`)只会复制对象的第一层,嵌套的对象仍然是原对象的引用。
- **深拷贝**:将对象的所有层级都复制出来,确保拷贝后的对象与原对象彻底分离。#### 浅拷贝示例:


const obj = { name: 'Alice', address: { city: 'New York' } };
const shallowCopy = { ...obj };shallowCopy.name = 'Bob';           // 修改浅拷贝后的值
shallowCopy.address.city = 'LA';    // 修改嵌套对象的值console.log(obj.address.city);      // 'LA' -> 原始对象的嵌套属性也被修改了

#### 深拷贝示例(手动实现):
如果没有使用 Lodash 或类似的库,可以手动实现深拷贝。最简单的方式是使用 `JSON.stringify` 和 `JSON.parse`,但这种方法只适用于对象属性是简单数据类型的情况,不支持 `Date`、`Function`、`undefined`、`Symbol` 等特殊类型:


const obj = { name: 'Alice', address: { city: 'New York' } };
const deepCopy = JSON.parse(JSON.stringify(obj));deepCopy.address.city = 'Los Angeles';
console.log(obj.address.city);  // 'New York' -> 原始对象没有被修改

### 总结:

- `cloneDeep` 是一种用于深度复制对象或数组的函数,可以确保复制后的对象与原对象完全独立。
- 它可以防止嵌套对象或数组在拷贝后相互影响,常用于避免数据的意外篡改或共享状态问题。
- 在实际项目中,`cloneDeep` 常来自于工具库(如 Lodash),也可以手动实现,但需要考虑复杂对象的特殊情况。

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

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

相关文章

LOGO设计新革命:5款AI工具让你秒变设计大师(必藏)

大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 你是否曾因设计一个既独特又专业的LOGO而感…

Tableau|二 如何利用功能区创建视图

一 认识 Tableau 数据 1.数据角色 维度和度量是Tableau的一种数据角色划分,离散和连续是另一种划分方式。 1.维度和度量 维度往往是一些分类、时间方面的定性字段,将其拖放到功能区时,Tableau不会对其进行计算,而是对视图区进行分…

Swin Transformer(ICCV 2021 best paper):基于卷积层级式架构的移动窗口视觉Transformer!

有关ViT的学习笔记详见:学习笔记——ViT(Vision Transformer)-CSDN博客 ViT在图像分类方面的结果令人鼓舞,但由于其低分辨率的特征映射和复杂度随图像大小的二次方增长,其架构不适合作为密集视觉任务或高分辨率输入图像的backbone。根据经验&…

JetBrains系列产品无限重置免费试用方法

JetBrains系列产品无限重置免费试用方法 写在前面安装插件市场安装插件 写在前面 支持的产品: IntelliJ IDEA AppCode CLion DataGrip GoLand PhpStorm PyCharm Rider RubyMine WebStorm为了保证无限重置免费试用方法的稳定性,推荐下载安装2021.2.2及其…

OpenAI GPT-3 API error: “This model‘s maximum context length is 2049 tokens“

题意:OpenAI GPT-3 API 错误:“此模型的最大上下文长度是 2049 个token” 问题背景: I have two issues relating to the response result from OpenAI completion. 我遇到了两个与OpenAI完成响应结果相关的问题 The following result does…

Sam Altman的博客:The Intelligence Age

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

《深入解析:水果销售数据库操作与查询技巧》

文章目录 一、数据库结构与数据源插入1.1 创建数据库与表1.2 插入数据 二、基础数据查询2.1 查询客户信息2.2 查询供应商信息 三、查询优化与技巧3.1 使用LIMIT子句 四、高级查询技巧4.1 使用聚合函数4.2 连接查询4.3 使用子查询 五、案例分析5.1 客户订单详情查询 一、数据库结…

无法将“allure”项识别为 cmdlet、函数、脚本文件或可运行程序的名称的解决方法-allure的安装配置全过程

新手在使用allure之前,以为只是pip install allure-pytest就可以,no!!! 其实,还需要下载allure,allure的具体步骤如下: 1.下载 allure。 allure的下载地址:Central Re…

828华为云征文 | 使用Linux管理面板1Panel管理华为云Flexus云服务器X实例

828华为云征文 | 使用Linux管理面板1Panel管理华为云Flexus云服务器X实例 一、华为云Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点 二、1Panel介绍2.1 1Panel 简介2.2 1Panel 特点 三、本次实践介绍3.1 本次实践简介3.2 本次环境规划 四、购…

报表做着太费劲?为你介绍四款好用的免费报表工具

1. 山海鲸可视化 介绍: 山海鲸可视化是一款免费的国产可视化报表软件,与许多其他宣传免费的软件不同,山海鲸的报表功能完全免费并且没有任何限制,就连网站管理后台这个功能也是免费的。同时山海鲸可视化还提供了种类丰富的可视化…

「数组」离散化 / Luogu B3694(C++)

目录 概述 思路 算法过程 复杂度 Code 概述 Luogu B3694: 给定一个长度为 n 的数列 aa。定义 rank(i) 表示数列 a 中比 ai 小的不同数字个数再加一。 对 1≤i≤n,现在请你求出所有的 rank(i)。 输出格式 对每组数据,输出一行 n 个整数&a…

BUUCTF [SCTF2019]电单车

使用audacity打开,发现是一段PT2242 信号 PT2242信号 有长有短,短的为0,长的为1化出来 这应该是截获电动车钥匙发射出的锁车信号 0 01110100101010100110 0010 0前四位为同步码0 。。。中间这20位为01110100101010100110为地址码0010为功…

关于预处理的一系列问题

1. 预定义符号 C语⾔设置了⼀些预定义符号,可以直接使⽤,预定义符号也是在预处理期间处理的。 2. #define定义常量 #define name stuff 如果定义的 stuff过⻓,可以分成⼏⾏写,除了最后⼀⾏外,每⾏的后⾯都加⼀个反…

值得入手的宠物空气净化器——希喂、352、IAM三款产品真实测评

在快节奏的现代生活中,养宠成为很多人的精神寄托,回到家中与猫咪玩耍是一天中最放松的时刻。但这美好的生活也存在着一些烦恼——宠物毛发清理与异味。宠物空气净化器作为一种新兴的清理工具,以其高效、全面的特点,受到了越来越多…

PMP--二模--解题--91-100

文章目录 14.敏捷91、 [单选] 在敏捷团队完成三次迭代之后,项目经理确定团队在这三次迭代中的平均速度是30个故事点。还有292个故事点来完成项目的剩余部分。团队需要多少次额外的迭代才能完成项目? 9.资源管理92、 [单选] 项目经理前往另一个国家执行最…

Go基础学习04-变量重声明;类型转换;类型断言;Unicode代码点;类型别名;潜在类型

目录 变量重声明 类型断言 类型转换 类型转换注意事项 Unicode代码点 类型别名、潜在类型 类型别名的意义 变量重声明 编写代码: package mainimport "fmt"var container []string{"Beijing", "Shanghai"}func main() {fmt.Pr…

关于Python升级以后脚本不能运行的问题

近日将Python从3.11升级到了3.12,然后把几个包例如numpy等也通过pip给upgrade了一下,结果原来运行的好好的脚本,都运行不了了,还出现各种报错。怀疑是自己升级了环境导致的,因此通过搜索引擎检索了一下,有这…

两个月学习大语言模型(LLM)的详细计划,保姆级教程非常详细收藏我这一篇就够了!

随着人工智能技术的发展,大语言模型(Large Language Models, LLMs)因其在自然语言处理、机器翻译、文本生成等领域的广泛应用而受到越来越多的关注。对于希望掌握这一前沿技术的朋友来说,制定一个系统的学习计划至关重要。本计划旨…

ATTCK实战系列-Vulnstack靶场内网域渗透(二)

ATT&CK实战系列-Vulnstack靶场内网域渗透(二) 前言一、环境搭建1.1 靶场下载地址1.2 环境配置1.2.1 DC域控服务器:1.2.2 WEB服务器:1.2.3 PC域内主机:1.2.4 攻击者kali: 1.3 靶场拓扑图 二、外网渗透2.…

Ubuntu磁盘不足扩容

1.问题 Ubuntu磁盘不足扩容 2.解决方法 安装一下 sudo apt-get install gpartedsudo gparted