什么是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如何实现用户密码重置功能?(完整流程代码)