什么是JavaScript的深拷贝_如何实现对象复制
发布时间 - 2025-12-25 00:00:00 点击率:次深拷贝是创建完全独立的新对象,避免引用类型数据相互影响;因对象数组为引用类型,浅拷贝仅复制地址会导致原对象被意外修改;常用方法包括JSON法(限纯JSON)、structuredClone(推荐现代环境)、手写递归(可定制)和Lodash cloneDeep(全面稳定)。
JavaScript 中的深拷贝,是指创建一个全新对象,其内部所有嵌套的对象、数组等引用类型数据也都被递归复制,新对象与原对象完全独立,互不影响。
为什么需要深拷贝
因为 JavaScript 中对象和数组是引用类型。直接赋值(浅拷贝)只是复制了引用地址,修改新对象里的嵌套内容,原对象也会跟着变:
let obj1 = { a: 1, b: { c: 2 } };
let obj2 = obj1; // 浅拷贝(其实是引用)
obj2.b.c = 99;
console.log(obj1.b.c); // 输出 99 —— 被意外改了
常见深拷贝方法及适用场景

没有一种方法完美适用于所有情况,需根据数据结构、是否含特殊值(如函数、undefined、Date、RegExp、Map、Set 等)来选择:
- JSON.parse(JSON.stringify(obj)):最简单快捷,但只支持纯 JSON 数据(不支持函数、undefined、Symbol、Date、RegExp、NaN、Infinity、循环引用)。适合配置对象、简单数据传输。
-
structuredClone()(现代浏览器 & Node.js 17.0+):原生支持深拷贝,能处理 Date、RegExp、Map、Set、ArrayBuffer、TypedArray 等,且支持循环引用。推荐在兼容环境下优先使用:
const newObj = structuredClone(originalObj); - 手写递归函数:可控性强,可定制处理逻辑(比如跳过某些字段、转换日期格式),但需手动处理边界情况(null、Date、RegExp、循环引用等)。适合有特殊需求或需兼容老环境的项目。
- Lodash 的 _.cloneDeep():成熟稳定,覆盖绝大多数边缘情况,包括循环引用、各种内置类型、不可枚举属性等。适合中大型项目,引入依赖可接受时使用。
手写简易深拷贝示例(不含循环引用处理)
供理解原理,生产环境建议用 structuredClone 或 Lodash:
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
if (obj instanceof Date) return new Date(obj);
if (obj instanceof RegExp) return new RegExp(obj);
const cloned = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
cloned[key] = deepClone(obj[key]);
}
}
return cloned;
}
注意容易忽略的点
- 函数、undefined、Symbol 在 JSON 方法中会丢失;
- 原型链上的属性不会被拷贝(深拷贝关注的是自有可枚举属性);
- DOM 元素、window 等宿主对象无法安全深拷贝,通常也不该这么做;
- 性能上,深拷贝开销随嵌套深度和数据量增大而上升,大数据量场景要考虑是否真的需要深拷贝,或改用不可变更新策略(如 Immer)。
# javascript
# java
# js
# node.js
# json
# node
# 大数据
# 浏览器
# win
# 递归函数
# 为什么
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用.env文件管理环境变量?(最佳实践)
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
WordPress 子目录安装中正确处理脚本路径的完整指南
php结合redis实现高并发下的抢购、秒杀功能的实例
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
html如何与html链接_实现多个HTML页面互相链接【互相】
Swift开发中switch语句值绑定模式
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
奇安信“盘古石”团队突破 iOS 26.1 提权
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
如何用美橙互联一键搭建多站合一网站?
Python文件流缓冲机制_IO性能解析【教程】
Windows Hello人脸识别突然无法使用
Laravel怎么实现验证码(Captcha)功能
如何自定义建站之星网站的导航菜单样式?
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
Python正则表达式进阶教程_复杂匹配与分组替换解析
javascript读取文本节点方法小结
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
如何在云虚拟主机上快速搭建个人网站?
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
如何做网站制作流程,*游戏网站怎么搭建?
QQ浏览器网页版登录入口 个人中心在线进入
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
Android GridView 滑动条设置一直显示状态(推荐)
Internet Explorer官网直接进入 IE浏览器在线体验版网址
如何快速搭建高效WAP手机网站?
如何快速搭建安全的FTP站点?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
油猴 教程,油猴搜脚本为什么会网页无法显示?
*服务器网站为何频现安全漏洞?
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
高端智能建站公司优选:品牌定制与SEO优化一站式服务
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
如何正确下载安装西数主机建站助手?
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
网站制作壁纸教程视频,电脑壁纸网站?
高端企业智能建站程序:SEO优化与响应式模板定制开发
Laravel如何优化应用性能?(缓存和优化命令)
JS实现鼠标移上去显示图片或微信二维码
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
Laravel怎么在Controller之外的地方验证数据
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
做企业网站制作流程,企业网站制作基本流程有哪些?
Angular 表单中正确绑定输入值以确保提交与验证正常工作
Laravel如何实现用户密码重置功能?(完整流程代码)
下一篇:Vue组件通信实践记录(推荐)
下一篇:Vue组件通信实践记录(推荐)

