JavaScript深浅拷贝详解与实现方法
时间:2025-10-30 23:21:50 393浏览 收藏
本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《JavaScript深浅拷贝方法解析》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~
浅拷贝只复制对象第一层属性,深层仍共享引用;深拷贝递归复制所有层级,完全断开引用。常用浅拷贝方法有Object.assign()、扩展运算符、slice()/concat();深拷贝可使用JSON.parse(JSON.stringify())(有限制)、递归实现、structuredClone()或Lodash的cloneDeep()。示例表明浅拷贝修改嵌套属性会影响原对象,而深拷贝不会。手动实现深拷贝需处理对象、数组、基本类型及特殊类型,但简单递归未解决循环引用,生产环境推荐成熟库。选择方式应根据数据类型、性能需求和兼容性综合考虑。

JavaScript中的深拷贝和浅拷贝主要针对引用类型(如对象、数组)在赋值时的行为差异。浅拷贝只复制对象的第一层属性,深层嵌套仍共享同一引用;而深拷贝会递归复制所有层级,完全断开引用关系。下面介绍几种常见的实现方式。
浅拷贝的常用方法
浅拷贝适用于只需复制第一层属性的场景,修改嵌套属性时仍会影响原对象。
- Object.assign():将源对象的所有可枚举属性复制到目标对象。注意仅复制一层。
- 扩展运算符 {...} :语法简洁,常用于对象或数组的浅复制。
- Array.prototype.slice() / concat():适用于数组,生成新数组但不深拷贝内部元素。
示例:
// 对象浅拷贝const obj1 = { a: 1, b: { c: 2 } };
const obj2 = Object.assign({}, obj1);
obj2.b.c = 3;
console.log(obj1.b.c); // 输出 3,说明是浅拷贝
深拷贝的基本方法
深拷贝能彻底隔离新旧对象,适合复杂嵌套结构。
- JSON.parse(JSON.stringify()):最简单的方法,但有局限性,无法处理函数、undefined、Symbol、循环引用等。
- 递归实现深拷贝:手动遍历对象属性,对引用类型递归调用拷贝函数,可控性强。
- 使用结构化克隆算法(Structured Clone):部分浏览器支持,如 structuredClone(),支持多数数据类型。
- 第三方库(如 Lodash):提供成熟的 _.cloneDeep() 方法,兼容性好。
示例:JSON方式
const obj1 = { a: 1, b: { c: 2 } };const obj2 = JSON.parse(JSON.stringify(obj1));
obj2.b.c = 3;
console.log(obj1.b.c); // 输出 2,成功深拷贝
手动实现一个简易深拷贝函数
通过类型判断和递归,可以处理大多数情况。
function deepClone(obj) {if (obj === null || typeof obj !== 'object') return obj;
if (obj instanceof Date) return new Date(obj);
if (obj instanceof Array) return obj.map(item => deepClone(item));
if (typeof obj === 'object') {
const cloned = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
cloned[key] = deepClone(obj[key]);
}
}
return cloned;
}
}
这个版本能处理对象、数组、基本类型和嵌套结构,但未解决循环引用问题。生产环境建议使用成熟库。
注意事项与适用场景
选择拷贝方式需结合实际需求。
- 若对象不含函数、日期、Symbol 等特殊类型,JSON方法最快捷。
- 需要完整支持各种类型时,推荐使用 Lodash 的 cloneDeep。
- 频繁操作且性能敏感,可考虑优化的递归实现或 structuredClone(现代浏览器)。
- 注意循环引用会导致递归爆栈或JSON报错,需额外检测。
基本上就这些,理解原理后可根据项目需求灵活选择。
今天关于《JavaScript深浅拷贝详解与实现方法》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
-
502 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
299 收藏
-
349 收藏
-
398 收藏
-
410 收藏
-
280 收藏
-
297 收藏
-
476 收藏
-
142 收藏
-
179 收藏
-
122 收藏
-
404 收藏
-
201 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习