JSON.stringify 配合 JSON.parse 可实现纯数据对象的深拷贝,但会丢失函数、undefined、Symbol、Date、RegExp 等类型,适用于无行为、可序列化的 DTO 或表单数据。

JSON.stringify 配合 JSON.parse 可以快速实现对象的深拷贝,但仅适用于纯数据对象,遇到函数、undefined、Symbol、Date、RegExp 等类型会丢失或报错。
基本用法:一行实现简单深拷贝
对只含字符串、数字、布尔值、null、数组和普通对象(且不含循环引用)的数据,可直接使用:
const original = { a: 1, b: [2, 3], c: { d: 4 } };
const copy = JSON.parse(JSON.stringify(original));
此时 copy 是 original 的一份全新嵌套副本,修改 copy.b 不会影响 original.b。
函数丢失:无法序列化 function 类型
JSON 标准不支持函数,JSON.stringify 会直接忽略键值为函数的属性:
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
const obj = {
name: 'Alice',
sayHi: function() { console.log('Hi'); },
arrow: () => {},
};
console.log(JSON.stringify(obj)); // {"name":"Alice"}
- sayHi 和 arrow 属性在 stringify 后消失,parse 后的对象中完全不存在
- 若需保留行为逻辑,必须手动重建方法,或改用结构化克隆(structuredClone)或第三方库(如 lodash.cloneDeep)
其他不可序列化的值也会被丢弃或转换
以下类型在 JSON.stringify 过程中会被特殊处理,导致深拷贝失真:
- undefined / 函数 / Symbol 作为对象属性值 → 整个键被忽略
- Date 对象 → 转为 ISO 字符串(如 "2023-01-01T00:00:00.000Z"),parse 后变成字符串,不再是 Date 实例
-
RegExp 对象 → 转为空对象
{} -
NaN / Infinity → 转为
null -
循环引用 → 直接抛出
TypeError: Converting circular structure to JSON
什么场景下可以放心用?
适合用于临时复制纯前端表单数据、配置项、API 响应中的 DTO(Data Transfer Object)等无行为、无特殊类型的扁平/嵌套结构:
- 接口返回的用户信息(仅含 name、email、roles 数组等)
- 本地存储前的轻量状态快照(确保不含函数和日期实例)
- 做对比 diff 前的原始数据备份(前提是已知数据形态干净)
只要数据来自 JSON API 或明确约束为可序列化类型,这个组合就高效可靠。否则,应选择更健壮的深拷贝方案。










