json.parse(json.stringify(obj))仅适用于纯数据对象,会丢失函数/undefined/symbol,使date变字符串、regexp变{},且不支持map/set/bigint等;推荐用structuredclone()或_.clonedeep()替代。

JavaScript 中可以用 JSON.parse(JSON.stringify(obj)) 实现一种简易的深拷贝,但它有明显限制,仅适用于纯数据对象(不包含函数、undefined、Symbol、Date、RegExp、Map、Set、BigInt 等)。
适用场景:只含基本类型和嵌套对象/数组的数据
这种写法能正确复制字符串、数字、布尔值、null、普通对象、数组及其任意嵌套组合。
例如:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
const original = {
name: "Alice",
hobbies: ["reading", "coding"],
address: { city: "Beijing", zip: 100000 }
};
const copy = JSON.parse(JSON.stringify(original));
copy.address.city = "Shanghai";
console.log(original.address.city); // "Beijing"(未被修改)
常见失效情况(务必注意)
以下内容在序列化过程中会被忽略、转换或报错,导致拷贝结果不符合预期:
-
函数、undefined、Symbol:被直接丢弃(如对象中的方法或
key: undefined字段消失) -
Date 对象:变成 ISO 字符串(
new Date() → "2023-01-01T00:00:00.000Z"),不再是 Date 实例 -
RegExp 对象:变成空对象
{} -
NaN、Infinity、-Infinity:转为
null -
循环引用:直接抛出
TypeError: Converting circular structure to JSON - Map、Set、TypedArray、BigInt:无法序列化,会报错或丢失
简单封装一个带提示的安全版本
可在开发中加一层判断,避免静默出错:
function safeJSONClone(obj) {
try {
return JSON.parse(JSON.stringify(obj));
} catch (e) {
console.warn("JSON clone failed:", e.message);
return null;
}
}
更可靠的替代方案
生产环境建议使用更健壮的方式:
- 结构简单时:用 structuredClone()(现代浏览器及 Node.js 17+ 支持,原生支持 Map/Set/Date/RegExp 等)
- 需兼容旧环境:用 Lodash 的
_.cloneDeep() - 自定义需求强:手写递归拷贝,按需处理特殊类型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










