首页 > web前端 > js教程 > 正文

javascript如何实现深拷贝_有哪些方法可以复制复杂对象

紅蓮之龍
发布: 2025-12-20 17:49:03
原创
754人浏览过
JavaScript深拷贝需递归遍历创建新结构,无万能方法:JSON方式最简但限制多;structuredClone为现代推荐方案;手写递归可定制且解循环引用;Lodash的cloneDeep最全面可靠。

javascript如何实现深拷贝_有哪些方法可以复制复杂对象

JavaScript 实现深拷贝的核心是**递归遍历对象或数组的每一层属性,创建全新结构,避免引用共享**。没有单一“万能”方法,需根据数据类型、环境支持和特殊需求选择合适方案。

JSON.parse(JSON.stringify()) —— 简单但限制多

适合纯数据对象(仅含字符串、数字、布尔值、null、数组、普通对象),不支持函数、undefined、Symbol、Date、RegExp、Map、Set、循环引用等。

  • ✅ 用法最简单:const copy = JSON.parse(JSON.stringify(obj))
  • ❌ 会丢失函数、undefined 属性;Date 变成字符串;正则变空对象;NaN 变 null
  • ⚠️ 遇到循环引用直接报错 TypeError: Converting circular structure to JSON

结构化克隆(structuredClone)—— 现代浏览器推荐方案

ES2022 引入的原生 API,支持大多数内置类型(Date、RegExp、Map、Set、ArrayBuffer、TypedArray、Blob、File、URL 等),也支持循环引用,且不执行 getter/setter。

  • ✅ 安全、高效、语义清晰:const copy = structuredClone(obj)
  • ✅ 浏览器兼容性良好(Chrome 98+、Firefox 94+、Safari 15.4+),Node.js 17.0+(需启用 --harmony-structured-clone)
  • ❌ 不支持函数、undefined、Symbol(同 JSON 方式);不能克隆带有私有字段的类实例(如 #field)

手写递归深拷贝 —— 灵活可控,适配定制需求

适用于需要处理特殊类型(如函数、正则、自定义类)、兼容老环境,或需跳过某些字段、控制克隆逻辑的场景。

Supermeme
Supermeme

Supermeme是一个AI驱动的Meme生成器,可以快速生成有趣的Meme梗图

Supermeme 114
查看详情 Supermeme

立即学习Java免费学习笔记(深入)”;

  • 核心思路:判断类型 → 分别处理(基本类型直接返回,引用类型递归复制)
  • 关键细节:用 WeakMap 记录已拷贝对象,解决循环引用问题
  • 示例片段(简化版):
    function deepClone(obj, map = new WeakMap()) {
      if (obj === null || typeof obj !== 'object') return obj;
      if (map.has(obj)) return map.get(obj);
      
      const copy = Array.isArray(obj) ? [] : {};
      map.set(obj, copy);
      
      for (const key in obj) {
        if (Object.prototype.hasOwnProperty.call(obj, key)) {
          copy[key] = deepClone(obj[key], map);
        }
      }
      return copy;
    }
    
    登录后复制

Lodash 的 _.cloneDeep() —— 生产环境常用可靠选择

经过大量测试的成熟工具函数,覆盖几乎所有边界情况(函数、Date、RegExp、Map、Set、TypedArray、循环引用、不可枚举属性等)。

  • ✅ 开箱即用,稳定健壮:const copy = _.cloneDeep(obj)
  • ✅ 支持浏览器与 Node.js,可按需引入(tree-shaking)
  • ❌ 增加依赖包体积;若项目已用 Lodash,非常推荐;否则轻量场景可考虑更小方案

以上就是javascript如何实现深拷贝_有哪些方法可以复制复杂对象的详细内容,更多请关注php中文网其它相关文章!

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号