深拷贝和浅拷贝讲解

浅拷贝

在JavaScript中,有几种实现浅拷贝的方法。浅拷贝会复制对象的属性值,但是如果属性值是对象的话,它们仍然会共享同一个引用。以下是几种常见的浅拷贝方法:
1、对象展开运算符(Spread Operator):这是一种简单且常见的浅拷贝方法。它使用 … 操作符来将一个对象的属性复制到另一个对象中。

const originalObj = { a: 1, b: 2 };
const shallowCopy = { ...originalObj };

2、Object.assign() 方法:这个方法可以用来将所有可枚举属性的值从一个或多个源对象复制到目标对象。

const originalObj = { a: 1, b: 2 };
const shallowCopy = Object.assign({}, originalObj);

3、Array.prototype.slice() 方法:这个方法对于数组的浅拷贝也是有效的。

const originalArray = [1, 2, 3];
const shallowCopy = originalArray.slice();

5、Array.prototype.concat() 方法:对于数组也可以使用 concat 方法进行浅拷贝。

const originalArray = [1, 2, 3];
const shallowCopy = originalArray.concat();

6、Array.from() 方法:这个方法可以将类数组对象或可迭代对象转换为真正的数组,也可以用于浅拷贝。

const originalArray = [1, 2, 3];
const shallowCopy = Array.from(originalArray);
深拷贝

深拷贝是指在拷贝对象或数组时,不仅复制其属性或元素的值,还要递归地复制其内部的所有对象或数组,确保拷贝后的对象或数组与原始对象或数组完全独立,彼此之间不会共享任何引用。在JavaScript中,实现深拷贝相对比较复杂,因为需要处理对象的嵌套结构和循环引用等情况。以下是几种实现深拷贝的方法:
1、递归实现:递归地遍历对象或数组,对每个属性或元素进行复制,并在遇到对象或数组时递归调用深拷贝函数。

function deepCopy(data) {if (typeof data !== 'object' || data === null) {return data; // 非对象直接返回}let copied = Array.isArray(data) ? [] : {};for (let key in data) {if (data.hasOwnProperty(key)) {// 递归复制子对象或子数组copied[key] = deepCopy(data[key]); }}return copied;
}

2、JSON 序列化与反序列化:利用JSON.stringify()将对象转换为JSON字符串,再利用JSON.parse()将JSON字符串解析为新的对象。这种方法简单易行,但是对于包含函数、正则表达式等特殊类型的属性会丢失。

function deepCopy(obj) {return JSON.parse(JSON.stringify(obj));
}

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

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

相关文章

线上剧本杀小程序开发,未来行业的发展趋势?

当下,剧本杀成为了大众最喜欢的娱乐方式之一,作为以沉浸式为主的剧本杀正成为新时代下的发展潮流。 数据显示,剧本杀行业已达到了百亿元。面对发展迅猛的剧本杀市场,越来越多的资本进入到了市场中,剧本杀的产业链也逐…

SecretFlow之SCQL部署(P2P方案)避雷纯享版

目录 前言一、搭建alice节点1.1、创建工作区1.2、准备状态数据、源数据1.3、配置 SCQLBroker1.4、配置 SCQLEngine1.5、创建 docker-compose 文件1.6、准备身份验证文件1.7、启动服务 二、搭建bob节点2.1、创建工作区2.2、准备状态数据、源数据2.3、配置 SCQLBroker2.4、配置 S…

python实现钉钉通讯录导出Excel表

Python工具开源专栏 Py0004 python实现钉钉通讯录导出Excel表 Python工具开源专栏前言目录结构部分演示完整代码已在GitHub上开源前言 需求来源于公司,需要将钉钉通讯录以Excel表的形式导出到本地,方便定期备份。导出的Excel需要处理钉钉用户兼任多部门的数据问题。功能大致如…

【C语言】手撕二叉树

标题:【C语言】手撕二叉树 水墨不写bug 正文开始: 二叉树是一种基本的树形数据结构,对于初学者学习树形结构而言较容易接受。二叉树作为一种数据结构,在单纯存储数据方面没有 顺序表,链表,队列等线性结构…

Pointnet++改进卷积系列:全网首发DynamicConv |即插即用,提升特征提取模块性能

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入DynamicConv,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二

菜鸟Java面向对象 2. Java 重写(Override)与重载(Overload)

Java 重写(Override)与重载(Overload) Java 重写与重载 Java 重写(Override)与重载(Overload)1. 重写(Override)1. 概念解释:2. 好处说明3. 异常规则处理 2. 方法的重写规则3. Super 关键字的使用4. 重载(Overload)**重载规则:**实例 5. 重写与重载之间的区别总结 1…

ReclaiMe Pro:丢失分区的恢复方法

天津鸿萌科贸发展有限公司是 ReclaiMe Pro 数据恢复软件的授权代理商。 ReclaiMe Pro 的分区恢复功能 ReclaiMe Pro 提供专业的分区恢复功能,支持从各种文件系统中搜索丢失和损坏的分区,例如 FAT、exFAT、NTFS、EXT、XFS 和 VMFS。 ReclaiMe Pro 启动…

Windows系统 清除本地maven仓库无用的 _remote.repositories、sha1、lastUpdated相关的文件

Windows系统 清除本地maven仓库无用的 _remote.repositories、sha1、lastUpdated相关的文件 脚本命令: set REPOSITORY_PATH 你自己本地maven仓库地址 rem starting... for /f "delims" %%i in (dir /b /s "%REPOSITORY_PATH%\*_remote.repositori…

什么是手机运营商三要素验证API接口

手机运营商三要素验证API接口又叫手机运营商三要素核验API接口,指的是输入姓名、身份证号码及手机号,通过运营商数据库实时校验此三项是否匹配。手机运营商三要素核验API接口广泛用于实名注册、风控审核等场景,如电商、直播、游戏、金融等。接…

复杂算子onnx导出(4):执行图的构建

文章目录 1. 执行图构建1.1 执行图构建1.2 执行图推理1.3 推理案例1.3.1 节点和engine的构建1.3.2 利用engine推理2. onnx解析并创建执行图2.1 onnx 转执行图并推理2.2 完整的代码前面几节已经介绍如何将带有复杂算子如 spconv导出 onnx,接下来如何对导出的onnx进行推理。带…

hashlib模块

【一】什么是摘要算法 Python的hashlib提供了常见的摘要算法 如MD5 SHA1等等。 摘要算法又称哈希算法、散列算法。 它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。 摘要算法就是通过摘要函数f()对…

Leetcode刷题之链表小结(1)|92反转链表|206反转链表

TOC 小结 1. 如何反转某一个节点的指向? 206反转链表(简单)的递归解法——该方法的理念是: 若节点k1到节点m已经被反转,而我们当前处于k位置,那么我们希望k1指向k, 体现在以下代码的head->next->next head;这一句,可以记做一种常用的反转单个…

AI+招聘,激活企业的「新质生产力」

两会以来,「新质生产力」成为热词。而所谓的新质生产力,是创新起主导作用,摆脱传统经济增长方式、生产力发展路径,具有高科技、高效能、高质量特征,符合新发展理念的先进生产力质态。新质之「新」,很重要的…

4-19 算法思路总结

leetcode 98 验证二叉搜索树 利用递归算法,从上而下递归,遇到false直接返回无需递归到叶子节点,从上往下递归时,传递并改变两个参数,对于当前节点的最大值以及最小值,对于根节点来说,初始化的最…

wandb注册 wandb: ERROR api_key

wandb: ERROR api_key not configured (no-tty). call wandb.login(key[your_api_key]) Traceback (most recent call last): 背景 使用yolov8训练时 在pycharm中出现wandb账号未注册错误 Transferred 355/355 items from pretrained weights TensorBoard: Start with tensor…

平衡二叉树(AVLTree)

AVLTree 1、树的分类2、平衡二叉树2.1、构建一个平衡二叉树2.2、删除节点2.3、搜索方式2.3.1、广度优先搜索(BFS)2.3.2、深度优先搜索(DFS) 1、树的分类 树形结构是编程当中特别常见的一种数据结构。比如电脑中的文件管理系统就大…

(超级详细)JAVA之Stream流分析-------持续更新喔!!!

学习目标: 掌握 Java Stream流的相关api 掌握 Java Stream流的基本实现 掌握 java Stream流的使用场景 代码已经整理上传到了gitee中,有需要的小伙伴可以取查看一下源码点个小心心喔 大家也可以帮我提交一点案例喔!!!&…

Springboot+vue的高校毕业与学位资格审核系统。Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的高校毕业与学位资格审核系统。Javaee项目,springboot vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&#x…

SpringMVC interceptor有时候配置的时候path=“/**“ 两个星号什么意思,与path=“/“以及path=“/*“什么区别

直接上案例&#xff1a; <mvc:interceptor> <mvc:mapping path"/**"/> <bean class"com.xuyang.interceptor.user.UserAuthInterceptor" /> </mvc:interceptor>/**的意思是所有文件夹及里面的子文件夹 /*是所有文件夹&#xff0c…

【QT进阶】Qt Web混合编程之使用ECharts显示各类折线图等

往期回顾 【QT进阶】Qt Web混合编程之QWebEngineView基本用法-CSDN博客 【QT进阶】Qt Web混合编程之CMake VS2019编译并使用QCefView&#xff08;图文并茂超详细版本&#xff09;-CSDN博客【QT进阶】Qt Web混合编程之html、 js的简单交互-CSDN博客 【QT进阶】Qt Web混合编程之使…