深拷贝函数必须避开JSON序列化,优先用structuredClone(现代环境),旧环境或需精细控制时手写递归,Lodash需customizer接管函数。

直接用 JSON.parse(JSON.stringify(obj)) 做深拷贝,函数一定会丢失——这不是 bug,而是 JSON 标准根本不支持函数序列化。想保留函数,必须绕开 JSON 路径,换用可编程控制的方案。
优先用 structuredClone(现代环境)
Chrome 98+、Firefox 94+、Node.js 18.13+/20.6+ 已原生支持 structuredClone():
- 它不丢函数:函数会被克隆为引用(函数体、参数、闭包结构保持不变)
- 自动处理循环引用,无需额外逻辑
- 同时正确保留
RegExp、undefined、Date、Map、Set等 - 注意:不支持
Symbol和Promise,但函数本身已安全保留
旧环境或需精细控制时手写递归
当兼容性要求高,或需绑定新上下文、保留 getter/setter、处理不可枚举属性时,推荐手写:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 遇到
function:直接赋值(cloned[key] = obj[key]),或用obj[key].bind({})创建干净副本 - 用
WeakMap缓存已克隆对象,防止循环引用死循环 - 用
Reflect.ownKeys()遍历所有键(含Symbol和不可枚举属性) - 对
RegExp、Date、Map、Set等分别新建实例并复制内容
用 Lodash 并配合 customizer
_.cloneDeep() 默认丢弃函数,但可通过 customizer 回调接管:
- 在 customizer 中判断
typeof value === 'function',显式返回value - 对
undefined可预处理转null,避免字段消失;对RegExp手动重建:new RegExp(value.source, value.flags) - 注意:Lodash 5.0 将移除
cloneDeep,长期项目建议评估迁移路径
本质上,避开函数丢失的关键不是“修复 JSON 方法”,而是放弃序列化思路,改用能识别并保留函数语义的克隆机制。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










