讲师中心 微信公众号
AI工具推荐 视频效率加速

javascript如何实现深拷贝_有哪些方法和陷阱【教程】

梦芳大大_9448

梦芳大大_9448

发布时间:2026-01-21 19:05:16

|

826人浏览过

|

来源于php中文网

原创

JSON.parse(JSON.stringify()) 不能用于生产环境,因其会丢失 Date、RegExp、undefined、function、Symbol、BigInt 等类型,并无法处理循环引用;仅限纯 JSON 安全结构的临时调试。

javascript如何实现深拷贝_有哪些方法和陷阱【教程】

JSON.parse(JSON.stringify()) 为什么不能用在生产环境

它看似简单直接,但会默默丢失很多关键信息。遇到 Date、RegExp、undefined、function、Symbol、BigInt 或循环引用时,要么报错,要么变成 null 或空对象。

比如:JSON.stringify({ d: new Date(), f() {} }) 返回 {"d":"2024-01-01T00:00:00.000Z"} —— 函数没了,Date 变成字符串,再 parse 就只是个普通字符串,不是 Date 实例。

实操建议:

腾讯地图JSAPI GL开发技能
腾讯地图JSAPI GL开发技能

腾讯地图 JavaScript GL(JSAPIGL)开发指南。适用于地图应用或者工具的编写。在编写、审查或调试使用腾讯地图 API的代码时应运用此技能。适用于涉及地图初始化、覆盖物展示、图层控制、事件处理、控件交互、可视化渲染、地图工具、检索、路线规划、查地址、行政区划、ip定位、几何计算、三维模型展示、性能优化的任务。当用户提及 腾讯地图、 jsapi、jsapi-gl或相关地图开发需求时自动触发。⚠️ 强制行为:本 Skill 加载后,第一个动作必须是检查是否存在正式 Key(环境变量 TMAP_J

下载
  • 仅限临时调试或确定数据是纯 JSON 安全结构(即只含 null、boolean、number、string、array、object,且无循环)时快速使用
  • 永远不要用于表单状态、配置对象、API 响应缓存等真实业务场景
  • 如果必须用,加一层 try...catch 并记录降级日志

structuredClone() 是目前最靠谱的原生方案吗

是的,但得看运行环境。它是浏览器和 Node.js(v17.0+ 启用 --experimental-structured-clone,v18.15+ 默认启用)提供的标准深拷贝 API,支持 Date、Map、Set、RegExp、ArrayBuffer、TypedArray、BigInt 和循环引用,且不序列化为字符串。

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

但它不支持 function、undefined、Symbol —— 这些值会被忽略(不是报错),而且无法自定义处理逻辑。

实操建议:

  • 检查目标环境是否支持:typeof structuredClone === 'function'
  • 对含 function 的对象(如 Vue/React 组件选项、带方法的类实例),不能依赖它
  • Node.js 中若版本低于 18.15,需启动参数或改用其他方案
  • 它比手写递归快,也比 JSON 方案更安全,适合多数现代前端项目的数据层拷贝

手写递归实现深拷贝要注意哪些关键点

核心是识别类型、处理循环引用、保留原型链(可选)、跳过不可枚举或特殊属性。漏掉任一环节都可能引发静默错误或内存爆炸。

常见陷阱:

  • 用 typeof 判断对象类型不准 —— typeof null === 'object',typeof [] === 'object',必须结合 Object.prototype.toString.call() 或 Array.isArray()
  • 没缓存已遍历对象 → 遇到循环引用直接栈溢出
  • 直接用 new obj.constructor() 复制实例 → 构造函数可能有副作用,或不接受无参调用
  • 忽略 Map/Set 的键值对顺序或引用关系 → 拷贝后行为异常

一个最小可行骨架示例(仅示意逻辑):

function deepClone(obj, cache = new WeakMap()) {
  if (obj === null || typeof obj !== 'object') return obj;
  if (cache.has(obj)) return cache.get(obj);
  
  const cloned = Array.isArray(obj) ? [] : {};
  cache.set(obj, cloned);
  
  for (const key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      cloned[key] = deepClone(obj[key], cache);
    }
  }
  return cloned;
}

Lodash 的 cloneDeep() 在什么情况下会出问题

它覆盖了绝大多数边界情况,但仍有几个隐蔽坑点:

  • 对带有自定义 toJSON() 方法的对象,会优先调用该方法再拷贝返回值,而不是按原结构深拷贝 —— 这可能导致意外截断(例如某些 ORM 模型对象)
  • 拷贝 Promise、Generator、Proxy 等非标准可枚举对象时,结果是空对象或浅拷贝,文档里没强调这点
  • 如果对象含有大量嵌套且深度超过 V8 调用栈限制(约 10k 层),仍会抛 RangeError: Maximum call stack size exceeded
  • 打包体积:单独为一个 cloneDeep 引入整个 Lodash,在轻量项目里可能得不偿失

如果你的项目已用 Lodash,它仍是当前最省心的选择;但若只是需要深拷贝,建议评估是否真要承担它的体积和隐式行为。

真正难的从来不是“怎么拷”,而是“拷完还像原来那样工作”——类型、引用、构造逻辑、不可枚举属性、环境兼容性,缺一不可。随便挑一个没处理好的点,上线后就可能表现为某个表单提交丢失时间、某个图表渲染错乱、某次撤销操作回退失败。

相关文章

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

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

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

1975

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2682

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

936

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2999

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5239

2023.08.02

java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

2090

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

143

2025.11.30

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

509

2023.09.22

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

60

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app快速上手
uni-app快速上手

共0课时 | 0人学习

Vue 教程
Vue 教程

共42课时 | 16.8万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 2.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn