json深拷贝仅适用于纯数据对象,核心写法为const deepcopy = json.parse(json.stringify(originalobj));不支持函数、undefined、symbol、date、regexp、map、set等,且丢失原型链和循环引用。

JavaScript 中可以用 JSON.stringify() 和 JSON.parse() 组合实现简易深拷贝,但仅适用于纯数据对象,不支持函数、undefined、Symbol、Date、RegExp、Map、Set 等特殊类型,且会丢失原型链和循环引用。
如何用 JSON 实现简易深拷贝
核心写法就是先序列化再反序列化:
const deepCopy = JSON.parse(JSON.stringify(originalObj));- 适用于只含字符串、数字、布尔值、null、数组、普通对象(键值均为可序列化类型)的数据结构
- 例如:
const obj = { name: "Alice", age: 25, hobbies: ["reading", "coding"] };→ 拷贝后完全独立
它无法处理的常见情况
JSON 序列化本身有严格限制,导致拷贝结果失真或报错:
- 函数、undefined、Symbol:会被直接忽略(undefined 和 Symbol 键被丢弃,函数值变成 null)
-
Date 对象:转成字符串(如
"2023-01-01T00:00:00.000Z"),不再是 Date 实例 -
RegExp、Map、Set、BigInt:序列化后变成空对象
{}或抛出错误 -
循环引用:
JSON.stringify()直接报错TypeError: Converting circular structure to JSON - 原型方法和 constructor:拷贝后是纯 plain object,不再继承原对象原型
什么场景下可以放心用
适合临时处理简单配置、API 响应数据、表单初始值等不含复杂类型的“数据载体”:
- 从后端获取的纯 JSON 数据(如
{ id: 1, title: "xxx", tags: [] }) - 需要快速重置表单状态,且表单数据不含函数或日期实例
- 做轻量级对比或缓存快照,不要求保留类型细节
替代方案建议
当需要真正可靠的深拷贝时,推荐更健壮的方式:
- 使用
structuredClone()(现代浏览器支持,能处理 Date、RegExp、Map、Set、ArrayBuffer 等) - 引入 Lodash 的
_.cloneDeep()(兼容性好,覆盖类型全面) - 自定义递归拷贝函数(按需支持特定类型,避免过度依赖)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











