关于Js深拷贝的三种方法详细讲解

目录

前言

一、pandas是什么?

二、使用步骤

1.利用函数递归来实现深拷贝

2.利用引入lodash包

3.利用JSON字符串转换

总结


前言

当涉及到JavaScript数据拷贝的时候,深拷贝是一个非常关键的概念。在JavaScript中,对象和数组被认为是引用类型,因此在进行赋值操作时,实际上是复制的引用而不是真正的拷贝。这就意味着当我们修改或操作某个拷贝后的对象或数组时,原始对象或数组也会被影响。

为了解决这个问题,我们可以使用深拷贝的方法来创建一个完全独立的副本,以便我们可以自由地修改或操作它,而不会影响到原始的数据。

在本文中,我们将详细讲解三种常用的JavaScript深拷贝方法,分别是递归拷贝、JSON序列化和使用第三方库。通过学习这些方法,我们将能够更好地理解深拷贝的原理以及如何在实际开发中应用它们。

让我们开始探索这三种方法,深入了解它们的优缺点以及适用场景。无论你是初学者还是有经验的开发者,相信本文都能对你有所帮助。让我们一起来掌握深拷贝的技巧,提升我们的JavaScript编程能力吧!


提示:以下是本篇文章正文内容,下面案例可供参考

一、为什么要用深拷贝?

二、使用步骤

1.利用函数递归来实现深拷贝

了解什么是递归函数:

如果一个函数在内部可以调用其本身,那么这个函数就是递归函数
 简单理解:函数内部自己调用自己, 这个函数就是递归函数
 递归函数的作用和循环效果类似
一个简单的递归函数:


 let u = 1;
      function pan() {
        console.log(`今天星期${u}`);
        if (u >= 7) {
          return;
        }
        u++;
        pan();
      }
      pan();

 

利用递归解释深拷贝问题:

 function deepColy(newobj, OldObj) {
        for (let k in OldObj) {
          if (OldObj[k] instanceof Array) {
            newobj[k] = [];
            deepColy(newobj[k], OldObj[k]); //再利用递归调用一下函数  []  ["小明", "小曹"]
          }
          if (OldObj[k] instanceof Object) {
            newobj[k] = {};
            deepColy(newobj[k], OldObj[k]); //再利用递归调用一下函数  {}   hoae: "河北", hoon: "邯郸",
          } else {
            //newobj[k]  创建   k 是属性名
            newobj[k] = OldObj[k];
          }
        }
      }

 

 总结:

当一个函数调用自身时,它会创建一个新的函数执行上下文,并将其添加到执行栈中。递归函数通常会包含一个或多个基本情况(base cases),用于终止递归的过程,并包含一个递归情况(recursive case),用于调用自身并不断进行计算。

递归在实现深拷贝时非常有用。在深层嵌套的对象或数组中,我们可以使用递归来遍历每个属性或元素,并进行拷贝操作。递归函数可以在遇到对象或数组时再次调用自身,以实现对嵌套层级的完全拷贝。

需要注意的是,在使用递归时,我们需要确保设置好基本情况,以避免进入无限循环的情况。此外,递归的性能可能不如迭代方式高效,因为每次调用递归函数都会创建新的函数执行上下文,消耗内存和处理时间。

2.利用引入lodash包

lodash

给大家说一下关于lodash如何使用:cmd下载方法

下载Lodash非常简单,可以使用npm(Node Package Manager)或者yarn来下载。

使用npm下载Lodash的命令是:

npm install lodash

使用yarn下载Lodash的命令是:

yarn add lodash

以上命令会自动从npm仓库下载Lodash,并将其添加到项目的依赖中。

如果你想下载Lodash的特定版本,可以使用以下命令:

使用npm下载特定版本的Lodash:

npm install lodash@版本号

使用yarn下载特定版本的Lodash:

yarn add lodash@版本号

例如,如果你想下载Lodash的4.17.21版本,可以使用以下命令:

使用npm下载Lodash 4.17.21:

npm install lodash@4.17.21

使用yarn下载Lodash 4.17.21:

yarn add lodash@4.17.21

下载完成后,你就可以在你的项目中引入和使用Lodash了。例如:

const _ = require('lodash');

// 使用Lodash的函数
const result = _.capitalize('hello world');
console.log(result); // 输出:Hello world

第二利用引入js包来解决 

我已经为大家下载好 需要的私信我 

也可以去 https://www.lodashjs.com/

 <script src="../第四天/lodash.min.js"></script>
    <script>
      const obj = {
        uname: "小明",
        age: 19,
        hooby: ["小明", "小曹"],
        finally: {
          hoae: "河北",
          hoon: "邯郸",
        },
      };
      const mang = _.cloneDeep(obj);
      console.log(mang);
      obj.finally.hoae = "四川";
      console.log(obj);
      console.log("_------------------------------------");

该处使用的url网络请求的数据。

3.利用JSON字符串转换

利用JSON字符串转换实现深拷贝的过程可以分为以下几个步骤:

  1. 首先,将需要拷贝的对象转换成JSON字符串。
const obj = { foo: 'bar', nested: { baz: 'qux' } };
const jsonString = JSON.stringify(obj);

  1. 然后,将JSON字符串转换回对象,这将创建一个新的对象。
const newObj = JSON.parse(jsonString);

  1. 现在,newObj是原始对象的深拷贝。你可以对newObj进行修改,而不会影响到原始对象。
newObj.foo = 'baz';
newObj.nested.baz = 'quux';

console.log(obj.foo); // 输出:'bar'
console.log(obj.nested.baz); // 输出:'qux'
console.log(newObj.foo); // 输出:'baz'
console.log(newObj.nested.baz); // 输出:'quux'

需要注意的是,使用JSON字符串转换方法实现深拷贝有一些限制。例如,如果对象中包含函数、不可枚举的属性、循环引用等特殊情况,JSON.stringify()可能会在转换过程中丢失或无法正确处理这些数据。在这种情况下,你可能需要使用其他深拷贝方法,如递归深拷贝或第三方库。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

我在工作一年时怎么都看不懂的编程写法。今天手把手教给你

作为一名程序员&#xff0c;你一定遇到或亲自写过这样的代码。有人将它形象的形容为shi山&#xff0c;或者被戏称为“面向保就业编程”。 以下面这个代码为例&#xff0c;其中的问题也显而易见&#xff0c;当越来越多的条件判断时&#xff0c;代码会变得非常臃肿&#xff0c;难…

Minecraft教程:使用MCSM面板搭建我的世界私服并实现远程联机

文章目录 前言1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 前言 Li…

学习笔记之——3D Gaussian Splatting及其在SLAM与自动驾驶上的应用调研

之前博客介绍了NeRF-SLAM&#xff0c;其中对于3D Gaussian Splatting没有太深入介绍。本博文对3D Gaussian Splatting相关的一些工作做调研。 学习笔记之——NeRF SLAM&#xff08;基于神经辐射场的SLAM&#xff09;-CSDN博客文章浏览阅读967次&#xff0c;点赞22次&#xff0…

【野火i.MX6ULL开发板】在MobaXterm平台利用Type-C线串口连接开发板

0、前言 参考文献&#xff1a; http://t.csdnimg.cn/9iRTm http://t.csdnimg.cn/Z0n60 问题&#xff1a;一直识别不出com口&#xff0c; 拟解决思路&#xff1a; 百度网盘重新下载Debian镜像&#xff0c;烧入full版镜像&#xff0c;随便换一下USB插口&#xff08;电脑主机上…

EI级 | Matlab实现VMD-TCN-GRU变分模态分解结合时间卷积门控循环单元多变量光伏功率时间序列预测

EI级 | Matlab实现VMD-TCN-GRU变分模态分解结合时间卷积门控循环单元多变量光伏功率时间序列预测 目录 EI级 | Matlab实现VMD-TCN-GRU变分模态分解结合时间卷积门控循环单元多变量光伏功率时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【EI级】Matlab实现…

图片纹理贴图

/* * 当需要给图形赋予真实颜色的时候&#xff0c;不太可能为没一个顶点指定一个颜色&#xff0c;通常会采用纹理贴图 * 每个顶点关联一个纹理坐标 (Texture Coordinate) 其它片段上进行片段插值 * */#include <iostream> #define STBI_NO_SIMD #define STB_IMAGE_IMPLE…

【Docker】Docker基础

文章目录 安装使用帮助启动命令镜像命令容器命令 安装 # 卸载旧版本 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine # 设置存储库 sudo yum install -y yum-utils …

数据结构与算法(十)深度优先搜索与广度优先搜索

广度优先搜索 广度优先搜索&#xff1a;从一个顶点出发&#xff08;由开始时顶点创造顺序优先决定&#xff09;&#xff0c;访问所有没有被访问过的临节点。然后在从被访问过的节点出发&#xff0c;重复之前的操作 如下为一个图 从1出发&#xff0c;先后访问2 3&#xff0c;之后…

VMware复制粘贴共享文件夹

win和虚拟机之间&#xff0c;无法复制粘贴&#xff0c;共享文件夹的解决方案。 安装VMware tools 1&#xff0c;先检查虚拟机设置部分。共享文件夹已启用。复制粘贴已启用。 2&#xff0c;安装tools.选择重新安装VMware tools. (此图片为安装过的截图) 成功后会显示如图。…

C++的一些书籍整理(个人学习)

UNIX环境高级编程&#xff08;第三版&#xff09; UNXI网络编程卷1 网络编程的笔记 收藏 我会了 一堆书 这个仓 数据库连接池原理介绍常用连接池介绍

计算机体系结构期末复习流程大纲

1.存储器和cache 存储器的容量、速度与价格之间的要求是相互矛盾的&#xff0c;速度越快&#xff0c;没bit位价格越高&#xff0c;容量越大&#xff0c;速度越慢&#xff0c;目前主存一般有DRAM构成。 处理器CPU访问存储器的指标&#xff1a; 延迟时间&#xff08;Latency&am…

LeetCode刷题--- 下降路径最小和

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述动…

Oracle文件自动“减肥”记

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

欧拉图及其应用

什么是欧拉图 提到欧拉图就要谈到哥尼斯堡七桥问题&#xff0c;最初有这样的一个问题的&#xff1a;18世纪中叶&#xff0c;东普鲁士哥尼斯堡城有一条贯穿全城的普雷格尔河&#xff0c;河中有两个岛&#xff0c;通过七座桥彼此相连&#xff0c;如下图所示 问题是这样的&…

UnitTestreport之UnitTest用例失败重运行机制

前言 很多小伙伴一直在诟病unittest&#xff0c;说unittest相对pytest来说太鸡肋了&#xff0c;pytest中提供了很多高级功能unittest中都没有。在这里还是想为unittest打抱不平一下&#xff0c;unittest是由python官方维护的官方库&#xff0c;官方库都是比较轻量级的&#xf…

以太坊开发者会议回顾:坎昆升级、硬分叉与布拉格

作者&#xff1a;Christine Kim Galaxy研究副总裁 编译&#xff1a;秦晋 碳链价值 2024年1月4日&#xff0c;以太坊开发人员齐聚Zoom for All Core Developers Execution (ACDE) Call #178 上。ACDE电话会议通常由以太坊基金会协议负责人Tim Beiko主持&#xff0c;是一个开发人…

【STM32】STM32学习笔记-串口发送和接收(27)

00. 目录 文章目录 00. 目录01. 串口简介02. 串口相关API2.1 USART_Init2.2 USART_InitTypeDef2.3 USART_Cmd2.4 USART_SendData2.5 USART_ReceiveData 03. 串口发送接线图04. USB转串口模块05. 串口发送程序示例06. 串口发送支持printf07. 串口发送支持printf_v208. 串口发送和…

5分钟彻底搞懂什么是token

大家好啊&#xff0c;我是董董灿。 几年前在一次工作中&#xff0c;第一次接触到自然语言处理模型 BERT。 当时在评估这个模型的性能时&#xff0c;领导说这个模型的性能需要达到了 200 token 每秒&#xff0c;虽然知道这是一个性能指标&#xff0c;但是对 token 这个概念却不…

聚道云软件连接器助力某餐饮管理有限公司实现人力资源信息自动化

客户介绍&#xff1a; 某餐饮管理有限公司是一家集餐饮连锁、餐饮管理、餐饮咨询等业务于一体的综合性餐饮企业。公司业务遍布全国多个城市&#xff0c;拥有众多员工。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 客户痛点&#xff1a; 员工入离职…

怎样把照片不想要的部分涂抹掉?安利下面这三款软件给你

在元旦假期的旅行中&#xff0c;我带着相机&#xff0c;用镜头记录下了每一个美好时刻。我爬上了高山之巅&#xff0c;俯瞰群山连绵起伏&#xff1b;我漫步在海滩上&#xff0c;感受海风轻拂脸颊&#xff1b;我甚至在城市的角落里&#xff0c;发现了那些平日里未曾留意的小确幸…