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

如何深度克隆对象javascript_有哪些可行的方法【教程】

千辰君_8573

千辰君_8573

发布时间:2026-01-30 19:30:40

|

574人浏览过

|

来源于php中文网

原创

JavaScript深度克隆推荐structuredClone()(现代环境)、JSON序列化(仅POJO)、手写递归(需WeakMap防循环)或Lodash的cloneDeep()(工程首选),需注意类型支持与引用一致性。

如何深度克隆对象javascript_有哪些可行的方法【教程】

JavaScript 没有原生的“深度克隆”函数,Object.assign() 和展开运算符 {...obj} 都只做浅拷贝,嵌套对象/数组仍共享引用——这是绝大多数意外修改的根源。

用 structuredClone()(推荐但注意兼容性)

这是目前最标准、语义最清晰的深度克隆方案,能正确处理 Date、Map、Set、ArrayBuffer 等内置类型,且自动跳过不可枚举属性和函数。

  • 仅支持现代环境:Chrome 98+、Firefox 94+、Edge 98+;Node.js 17.0+(需启用 --harmony-structured-clone 标志,18.12+ 默认开启)
  • 不支持 RegExp、Error、Promise、function、undefined、Symbol 键——遇到会直接抛错:DataCloneError
  • 示例:const clone = structuredClone(originalObj);

用 JSON.parse(JSON.stringify(obj))(快但限制极多)

这是最常被误用的“伪深克隆”,本质是序列化再反序列化,只适用于纯数据对象(POJO)。

  • 会丢失:Date(变成字符串)、undefined(被忽略)、function(被忽略)、RegExp(变成空对象)、NaN/Infinity(变成 null)
  • 无法处理循环引用,直接报错:TypeError: Converting circular structure to JSON
  • 对 BigInt 报错:TypeError: Do not know how to serialize a BigInt
  • 仅适合临时调试或已知结构简单、无副作用的数据

手写递归克隆(可控但易漏边界)

当需要支持 RegExp、Date、Map、Set 或处理循环引用时,必须自己实现。关键不是“写得短”,而是覆盖类型判断和引用缓存。

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

  • 必须用 WeakMap 缓存已克隆的对象,否则循环引用会栈溢出
  • 区分 Array.isArray() 和 typeof obj === 'object',避免把 null 当对象处理
  • new obj.constructor() 不安全:自定义类可能没有无参构造函数,或构造函数有副作用
  • 更稳妥的做法是按类型分别处理:if (obj instanceof Date) → new Date(obj.getTime()),if (obj instanceof RegExp) → new RegExp(obj.source, obj.flags)

Lodash 的 _.cloneDeep()(工程首选)

在真实项目中,除非有强约束(如不能引入依赖),否则直接用 _.cloneDeep() 是最省心的选择。

  • 支持所有常见类型:Date、RegExp、Map、Set、TypedArray、甚至 Buffer(Node.js)
  • 自动检测并处理循环引用,不报错也不卡死
  • 可被 Tree-shaken(ESM 导入下),体积影响可控:import { cloneDeep } from 'lodash-es';
  • 注意:不要用 lodash 全量包,它默认是 CommonJS,破坏 ESM 构建链路

真正麻烦的从来不是“怎么克隆”,而是“克隆后谁负责维护引用一致性”。比如克隆一个含事件监听器或 DOM 节点的对象,深克隆反而会让逻辑断裂——这时候该考虑的往往不是克隆,而是重构数据流或使用不可变更新模式。

相关文章

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

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

下载

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

热门AI工具

更多
DeepSeek

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

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

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

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

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

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

相关专题

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

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

2195

2023.08.07

json是什么
json是什么

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

3482

2023.08.23

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

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

1176

2023.10.13

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

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

4019

2025.09.10

chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

2826

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

5679

2023.11.06

Chrome开启无痕模式
Chrome开启无痕模式

本专题整合了Chrome无痕模式开启相关内容,阅读专题下面的文章了解更多详细教程。

4027

2026.03.24

edge是什么浏览器
edge是什么浏览器

Edge是一款由Microsoft开发的网页浏览器,是Windows 10操作系统中默认的浏览器,其目标是提供更快、更安全、更现代化的浏览器体验。本专题为大家提供edge浏览器相关的文章、下载、课程内容,供大家免费下载体验。

3042

2023.08.21

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.3万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.7万人学习

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

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