当前位置: 首页 > news >正文

一文读懂 JavaScript 中的深浅拷贝

在 JavaScript 编程里,深浅拷贝是处理数据时极为关键的概念。理解它们的差异,能帮我们规避许多数据操作上的 “陷阱”。今天,咱们就借助简单的 “abc” 相关示例,深入探索深浅拷贝的奥秘,并且通过在浏览器控制台输出结果,让大家有更直观的感受。

一、浅拷贝:共享的 “小秘密”

浅拷贝会创建一个新的对象或数组,新对象里的属性值,对于基本数据类型(像字符串、数字、布尔值),是独立复制的;但对于引用数据类型(比如对象、数组),新对象和原对象的这些属性引用的是同一块内存地址。打个比方,就好像两个人共用一个笔记本,一个人写了东西,另一个人也能看到。

在 JavaScript 中,Object.assign() 是实现浅拷贝的常用方法。我们在浏览器控制台里试试:

// 创建一个原对象
const originalObject = {a: 'abc',b: {c: 'abc'}
};
// 使用Object.assign进行浅拷贝
const copiedObject = Object.assign({}, originalObject);
// 尝试修改原对象的基本数据类型属性a
originalObject.a = '修改abc';
// 查看原对象和浅拷贝对象的a属性
console.log('原对象a:', originalObject.a);
console.log('浅拷贝对象a:', copiedObject.a);
// 尝试修改原对象的引用数据类型属性b里的c
originalObject.b.c = '修改后的abc';
// 查看原对象和浅拷贝对象的b.c属性
console.log('原对象b.c:', originalObject.b.c);
console.log('浅拷贝对象b.c:', copiedObject.b.c);

控制台结果:

运行这段代码后,从控制台输出结果能发现,修改原对象的基本数据类型属性 a,浅拷贝对象的 a 不受影响;然而修改原对象引用数据类型属性 b 里的 c 时,浅拷贝对象的 b.c 也跟着变了。这就是浅拷贝的特性,基本数据类型 “各自为政”,引用数据类型 “共享信息” 。 

二、深拷贝:彻底的 “分家”

深拷贝则是彻头彻尾地创建一个全新的对象或数组,新对象的所有属性和原对象完全分离,互不干扰。不管属性是基本数据类型还是引用数据类型,都有自己独立的存储空间。这就好比两个人各自有一个笔记本,谁写什么都不会影响对方。

实现深拷贝,JSON.parse(JSON.stringify()) 是个简单易用的方法。同样在浏览器控制台操作:

// 创建一个原对象
const originalObj = {x: 'abc',y: {z: 'abc'}
};
// 使用JSON.parse(JSON.stringify())进行深拷贝
const deepCopiedObj = JSON.parse(JSON.stringify(originalObj));
// 修改原对象的引用数据类型属性y里的z
originalObj.y.z = '不一样的abc';
// 查看原对象和深拷贝对象的y.z属性
console.log('原对象y.z:', originalObj.y.z);
console.log('深拷贝对象y.z:', deepCopiedObj.y.z);

 控制台结果:

从控制台的输出可以明显看出,修改原对象的引用数据类型属性 y.z,深拷贝对象的 y.z 丝毫不受影响,这就是深拷贝 “彻底分家” 的效果。

不过,JSON.parse(JSON.stringify()) 并非万能的。它没办法处理包含函数、正则表达式、undefined 等特殊类型的数据。要是遇到这种情况,可以借助 lodash 库中的 cloneDeep 方法。先在页面引入 lodash 库:

<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
// 创建一个包含特殊数据(这里假设是一个简单对象,模拟特殊情况)的原对象
const original = {special: {a: 'abc'}
};
// 使用lodash的cloneDeep进行深拷贝
const deepCopied = _.cloneDeep(original);
// 查看原对象和深拷贝对象的special.a属性
console.log('原对象special.a:', original.special.a);
console.log('深拷贝对象special.a:', deepCopied.special.a);

注意:可自行尝试

三、总结

深浅拷贝在 JavaScript 开发中至关重要。浅拷贝适用于基本数据类型为主,且部分引用数据类型修改可共享的场景;深拷贝则用于需要确保数据完全独立,避免相互干扰的情况。通过这些简单的 “abc” 示例和浏览器控制台的实践,希望大家对深浅拷贝有更清晰的认识,在今后的代码编写中能够游刃有余地处理数据。

 

 

http://www.xdnf.cn/news/220609.html

相关文章:

  • IEC61499编程方式与传统PLC编程方式比较
  • 生态修复项目管理软件
  • RPCRT4!NdrpEmbeddedPointerMemorySize函数分析之第二次循环
  • 应急演练考试排查-WebSever03
  • P5633 最小度限制生成树
  • Linux环境变量以及进程虚拟地址原理
  • DVWA靶场保姆级通关教程---02命令注入
  • 5.4.2 MVVM例2-用户控件的使用(水在水管中流动的实例)
  • 路径规划算法总结:从 Dijkstra 到 A* 与 Hybrid A
  • GUI_DrawPixel 函数详解
  • BalenaEtcher 2.1镜像烧录工具软件下载及安装教程
  • Vite性能优化指南 ✅
  • 强化学习(二)马尔科夫决策过程(MDP)
  • java AsyncTool
  • ACTF2025 - WEB Excellent-Site
  • 第十章:CrewAI - 面向流程的多 Agent 结构化协作
  • Andorid车机UI适配,AndroidUI图px的单位,如何适配1920x720,PPI100的屏幕设备
  • 【GESP】C++三级练习 luogu-B2117 整理药名
  • Rockchip Android平台打开GKI无法开机问题
  • 应用服务器-IIS
  • 推荐系统中 Label 回收机制之【时间窗口设计】
  • 基于Lucene的多场景检索系统开发指南
  • [按键安卓ios脚本辅助插件开发]数组排序函数例子
  • 明远智睿SSD2351开发板:开启嵌入式开发新篇程
  • C#实现对达索(Dassault)SolidWorks中3D图纸转化为手机可直接查看预览图纸格式
  • 高级项目管理
  • 巧记英语四级单词 Unit6-下【晓艳老师版】
  • C++程序退出时的对象析构陷阱:深度解析与避坑指南
  • mysql 事务中如果有sql语句出错,会导致自动回滚吗?
  • 力扣刷题总表