json深拷贝会静默丢失函数属性,因json格式仅支持字符串、数字、布尔值、null、数组和对象六种类型,函数不可序列化;调用json.stringify()时自动忽略函数等不可序列化值,后续parse无法还原。

JSON 方法深拷贝会直接丢弃函数类型属性,不会保留,也不会报错,属于静默丢失。
为什么函数会被删掉
因为 JSON 格式本身不支持函数。JSON 是一种纯数据交换格式,只定义了字符串、数字、布尔值、null、数组和对象这六种基本类型,函数不属于其中任何一种。当调用 JSON.stringify() 时,JavaScript 引擎会跳过无法序列化的值(包括函数、undefined、Symbol、正则表达式等),不报错也不提示,导致这些字段在字符串化阶段就被过滤掉了。
实际表现示例
例如:
const obj = {
name: 'Alice',
sayHi: function() { console.log('Hello'); },
age: 28
};
const cloned = JSON.parse(JSON.stringify(obj));
console.log(cloned); // { name: 'Alice', age: 28 }
console.log(typeof cloned.sayHi); // 'undefined'
可以看到:sayHi 属性完全消失,访问 cloned.sayHi 得到 undefined。
替代方案建议
若需保留函数,不能依赖 JSON 方法,应选用以下方式之一:
- 手写递归深拷贝函数(如知识库中提供的
deepClone),对function类型做特殊处理(原样赋值或包装) - 使用结构化克隆(
structuredClone(),现代浏览器支持,可保留函数、Map、Set、Date、RegExp 等) - 引入成熟工具库,如 Lodash 的
_.cloneDeep(),内部已处理各类边界情况
小提醒:别混淆“删除”和“忽略”
这不是 delete 操作符在起作用,也不是运行时主动删除属性;而是 JSON.stringify() 在序列化过程中对不可表示值的自动忽略——它根本没把函数转成字符串,后续 JSON.parse() 自然也就无从还原。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











