如何规避JSON深拷贝无法处理Function、RegExp与undefined的缺陷

夜丽小哥_3753

夜丽小哥_3753

2026-06-25

500人浏览

原创

json.parse(json.stringify(obj)) 无法深拷贝 function、regexp 和 undefined,因 json 标准不支持;推荐优先用 structuredclone()(现代环境),其次手写递归(兼容旧版、可控性强),或 lodash + customizer 定制处理。

如何规避json深拷贝无法处理function、regexp与undefined的缺陷

直接用 JSON.parse(JSON.stringify(obj)) 做深拷贝时,Function、RegExp 和 undefined 会彻底丢失或失真——这不是 bug,而是 JSON 标准本身不支持这三类值。想规避,关键不是“绕过限制”,而是换掉整个流程,用可编程控制的方案替代纯序列化路径。

用 structuredClone() 优先尝试

现代环境(Chrome 98+、Firefox 94+、Node.js 18.13+/20.6+)已原生支持 structuredClone(),它能正确处理 RegExp 和 undefined(保留原始值),对 Function 则克隆引用(注意:函数体不变,但 this 和闭包行为需自行验证)。它天然防循环引用,无需额外处理。

  • RegExp 实例会被完整复制,包括 source 和 flags
  • undefined 字段不会被跳过,仍保留在目标对象中
  • 不支持 Symbol、Promise、DOM 节点等,但对上述三类缺陷已覆盖大部分场景

手写递归 clone,精准控制每种类型

当需要兼容旧环境,或必须保留函数体逻辑(如绑定新上下文)、或需处理 Symbol/不可枚举属性时,手写递归是最灵活的方式。核心是分类判断 + WeakMap 防循环:

Feishu calendar sync, local ics to json data for AI agent
Feishu calendar sync, local ics to json data for AI agent

将ICS日历文件转为JSON格式,用于飞书日历导入导出及数据集成。

下载
  • 遇到 Function:直接赋值,或用 value.bind({}) 创建无依赖副本
  • 遇到 RegExp:新建实例 new RegExp(value.source, value.flags)
  • 遇到 undefined:不跳过,原样赋值(cloned[key] = obj[key])
  • 用 Reflect.ownKeys(obj) 遍历所有键(含不可枚举、Symbol 键),确保不漏
  • 用 WeakMap 缓存源对象与克隆对象映射,重复引用直接返回缓存结果

用 Lodash 并启用 customizer 保留函数

_.cloneDeep() 默认丢弃函数,但可通过 customizer 回调干预:

  • 对函数类型显式返回自身:return typeof value === 'function' ? value : undefined
  • 配合预处理,把 undefined 显式转为 null(再用 _.cloneDeep 处理),避免字段消失
  • RegExp 仍需在 customizer 中手动重建,例如检测 value instanceof RegExp 后返回新实例

对 undefined 的处理要先问清语义

很多场景下,undefined 并非业务必需,而是初始化遗漏。更稳健的做法是:

  • 接口约定空值统一用 null,而非 undefined(JSON 安全且语义明确)
  • 若必须兼容含 undefined 的旧数据,可在深拷贝前做一次标准化:JSON.stringify(obj, (k, v) => v === undefined ? null : v),再 parse + 深拷贝
  • 不建议为保留 undefined 而强行用复杂递归——先确认它在你的数据流里是否真的代表一种有效状态

相关专题

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

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

2023.08.07

2015

5

json是什么
json是什么

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

2023.08.23

2902

1

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

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

2023.10.13

996

3

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

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

2025.09.10

3259

7

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

2023.06.20

3996

8

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

2023.07.05

2521

4

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

6842

9

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

2023.08.11

792

5

正则表达式空格
正则表达式空格

正则表达式空格可以用“\s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

500

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.8万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习