JavaScript 里的深拷贝和浅拷贝

news2024/9/9 5:15:53

JavaScript 里的深拷贝和浅拷贝

JS中数据类型分为基本数据类型引用数据类型

基本类型值指的是那些保存在内存中的简单数据段。包含NumberStringBooleanNullUndefinedSymbol

引用类型值指的是那些保存在内存中的对象,所以引用类型的值保存的是一个指针,这个指针指向对象的地址。引用类型包含Object 类型、Array 类型、Date 类型、RegExp 类型、Function 类型 等。

因为引用类型保存的是指向存储地址的指针,所以我们直接把一个引用类型赋值给另外一个引用类型时候,相当于是把指针赋值过去,实际上两个对象的存储地址是一样的。因此也就导致这两个对象共用地址,只要地址里的数据被修改后,两个对象的值都会改变。

浅拷贝的实现方式

1.Array.concat()
const arr = [1,2,3];
const copy = arr.concat(); 
console.log(copy); // 输出: [1, 2, 3]
2.Object.assign()
const arr= [1,2,3];
const copy1 = Object.assign({}, arr); 
console.log(copy); // 输出: [1, 2, 3]
3.slice()
const arr= [1,2,3];
let copy = arr.slice();  
console.log(copy); // 输出: [1, 2, 3]
4.扩展运算符 …
const arr= [1,2,3];
const copy = [...arr];
console.log(copy); // 输出: [1, 2, 3]

深拷贝

1.JSON.parse()和JSON.stringify()
const obj1 = {
    x: 1, 
    y: {
        m: 1
    }
};
const obj2 = JSON.parse(JSON.stringify(obj1));
console.log(obj2) //{x: 1, y: {m: 1}}

1.这是最简单的方法之一,但它有一些限制,比如不能正确处理函数、undefinedSymbol、循环引用等特殊类型的值。

2.它会抛弃对象的constructor。也就是深拷贝之后,不管这个对象原来的构造函数是什么,在深拷贝之后都会变成Object

3.如果对象中存在循环引用的情况无法正确处理。

2. 递归复制

通过递归函数手动复制对象的每个属性。这种方法可以处理更复杂的对象和特殊情况(如循环引用)。

function deepClone(obj, hash = new WeakMap()) {  
  if (obj === null) return null; // null 的情况  
  if (obj instanceof Date) return new Date(obj); // 日期对象直接返回一个新的日期对象  
  if (obj instanceof RegExp) return new RegExp(obj); // 正则对象直接返回一个新的正则对象  
   //hash判断该属性是否被复制
  // 如果循环引用了就用 weakMap 来解决  
  if (hash.has(obj)) return hash.get(obj);  
  
  let allDesc = Object.getOwnPropertyDescriptors(obj);  
  let cloneObj = Object.create(Object.getPrototypeOf(obj), allDesc);  
  hash.set(obj, cloneObj);  
  
  for (let key of Reflect.ownKeys(obj)) {  
    if (typeof obj[key] === 'object' && obj[key] !== null) {  
      cloneObj[key] = deepClone(obj[key], hash);  
    } else {  
      cloneObj[key] = obj[key];  
    }  
  }  
  return cloneObj;  
}  
  
// 使用示例  
let original = { a: 1, b: { c: 2 } };  
original.b.d = original; // 创建一个循环引用  
let clone = deepClone(original);  
console.log(clone);  

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

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

相关文章

光伏可行性研究报告能否自动生成?

随着技术的不断进步和应用的广泛普及,光伏项目的规划与实施也面临着更加复杂多变的考量因素,其中,光伏可行性研究报告成为了项目前期不可或缺的重要内容。那么,面对这一需求,光伏可行性研究报告能否实现自动生成呢&…

Nat Med·UNI:开启计算病理学新篇章的自监督基础模型|顶刊精析·24-07-31

小罗碎碎念 本期推文主题 这一期推文是病理AI基础模型UNI的详细介绍,原文如下。下期推文会介绍如何使用这个模型,为了你能看懂下期的推文,强烈建议你好好看看今天这期推文。 看完这篇推文以后,你大概就能清楚这个模型对自己的数据…

搞懂数据结构与Java实现

文章链接:搞懂数据结构与Java实现 (qq.com) 代码链接: Java实现数组模拟循环队列代码 (qq.com) Java实现数组模拟栈代码 (qq.com) Java实现链表代码 (qq.com) Java实现哈希表代码 (qq.com) Java实现二叉树代码 (qq.com) Java实现图代码 (qq.com)

《计算机网络》(第8版)考研真题

第一章 一、选择题 1 在 TCP/IP 体系结构中,直接为 ICMP 提供服务的协议是( )。[2012 年统考] A .PPP B .IP C .UDP D .TCP 【答案】B 【解析】A 项:PPP 在 TCP/IP 体系结构中属于网络接口层协议(在 ISO/OSI 体系结构中属于数据链路层协议),所以 PPP 为网络层提供…

免费【2024】springboot 厨房达人美食分享平台

博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

图片格式转换教程:百种格式随意转换,建议收藏使用!

图片格式转换方法有哪些?本文整理了几款好用且简单的格式转换工具,适用于处理各种图片格式转换的难题。 常见的图片格式转换有png转换为jpg、heic转jpg、webp转jpg等,特别是heic、webp、这两种图片格式,格式比较特殊,兼…

《最新出炉》系列入门篇-Python+Playwright自动化测试-57- 上传文件 - 番外篇

软件测试微信群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 前边的三篇文章基本上对文件上传的知识介绍和讲解的差不多了,今天主要是来分享宏哥在文件上传的实际操作中发现的一个问题:input控件和非input控件的上…

打破技术壁垒,加速企业数字化转型:低代码平台如何降低开发门槛

科技飞速发展,企业数字化转型趋势不可逆转。数字化转型不仅能够优化内部运营流程,提升管理效率,还能通过数据驱动决策,增强市场竞争力。传统开发模式因技术门槛、周期长,限制了企业创新与响应速度。 低代码平台应运而生…

Android进阶之NDK开发,保姆级教程

目录 前言NDK下载CMake文件创建指定ABI架构编写CMake文件编写JNI方法Java调用CC调用Java 生成JNI头文件实现对应C方法编译so文件编写demo验证运行效果总结 前言 作为Android应用开发从业者来说,掌握NDK开发是必备技能之一,本文将从NDK环境下载&#xff…

Spring源码-xml配置文件如何加载解析默认标签变为BeanDefinition

1.创建Environment new StandardEnvironment() createEnvironment:346, AbstractApplicationContext (org.springframework.context.support) getEnvironment:332, AbstractApplicationContext (org.springframework.context.support) resolvePath:131, AbstractRefreshable…

通俗易懂理解提示词工程、RAG和微调

在当今的人工智能领域,提示工程、RAG(检索增强生成)和微调是三个重要的概念。本文将通过简单易懂的方式,帮助大家理解这三者之间的关系和应用。 大模型的训练过程 📊 在当今的人工智能领域,大模型的训练是…

如何使用 Flask 或 Django 创建 Web 应用

Flask和Django是Python中最受欢迎的两个Web框架,它们各有优点,适用于不同的应用场景。 一、使用Flask创建Web应用 1.1 Flask简介 Flask是一个轻量级的Web框架,以其简洁、易用和灵活著称。它遵循“微框架”的设计理念,只提供核心…

批量输出文件夹内所有文件名和文件——vba实现

导出一个文件夹下所有文件名,可用vba插件实现,如图 如下图,已在桌面生成一个txt文本,但此方法只可输出一级目录下的文件,若输出所有文件,则需修改插件代码 (若想导出硬盘下所有文件和文件夹&…

Windows10+VS2019编译Faiss

先放上我编译好的静态库,要配合OpenBLAS使用 通过百度网盘分享的文件:3rdparty.zip 链接:https://pan.baidu.com/s/1yPys-CX_EdmnJzj66g_KlQ?pwdh6ff 提取码:h6ff –来自百度网盘超级会员V1的分享 1.源码下载 首先下载Faiss地…

C++ STL inner_product 用法

一&#xff1a;功能 求内积&#xff0c; 给定两个向量x&#xff0c;y&#xff0c;内积公式如下&#xff1a; 二&#xff1a;用法 #include <iostream> #include <vector> #include <numeric>int main() {std::vector<int> height…

量子®膜高端服务门店品牌膜天轮全膜服务中心再添新成员 南京膜天轮量子®膜全膜中心(东麟路店)盛大启幕!

7月26日上午&#xff0c;膜天轮量子膜南京全膜中心&#xff08;东麟路店&#xff09;盛大开业&#xff0c;正式成为膜天轮品牌的第二十家门店。 圣戈班舒热佳特殊镀膜有限公司亚太区总裁陈剑超先生、圣戈班舒热佳特殊镀膜有限公司亚太区商务总监李振华先生、圣戈班舒热佳特殊镀…

FlashAttention解析——大预言模型核心组建

论文名称&#xff1a;FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 论文地址&#xff1a;https://arxiv.org/abs/2205.14135 一、研究FlashAttention的Motivate FlashAttention技术在现在的主流大语言模型中均有应用&#x…

2024靠这份软件测试面试题宝典已成功上岸,跳槽成功

上月很多朋友靠这份面试宝典拿到大厂的office&#xff0c;跳槽成功&#xff0c;面试找工作的小白和要跳槽进阶都很适合&#xff0c;没有一点准备怎么能上岸成功呢&#xff1f; 这份面试题宝库&#xff0c;包含了很多部分&#xff1a;测试理论&#xff0c;Linux基础&#xff0c…

Java中级

IDAE介绍 IDEA&#xff0c;全称为IntelliJ IDEA&#xff0c;是一款由JetBrains公司开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于Java开发&#xff0c;但也支持多种其他编程语言和框架&#xff0c;如Kotlin、Scala、Groovy、Android、Spring、Hibernate…

SpringBoot Mysql->达梦8 activiti6.0.0 项目迁移

全部源码&#xff1a;公众号搜索资小库&#xff0c;回复dm获取源码 1.整合达梦 1.1 达梦驱动下载 MyBatis-Plus 框架 | 达梦技术文档 (dameng.com) 1.2 数据迁移 怎么安装数据库&#xff0c;很多大佬有帖子&#xff0c;搜一下达梦先建立用户&#xff0c;使用DM管理工具 链…