javascript对象拷贝核心在于区分值与引用,仅引用类型需深浅拷贝判断;浅拷贝只复制第一层、嵌套仍共享;json方法轻量但丢失函数/date/循环引用;生产环境推荐fast-copy(高性能、全类型支持、保留原型)或lodash.clonedeep。

JavaScript对象拷贝的核心在于区分“值”与“引用”——基本类型天然独立,引用类型默认共享内存。真正需要深浅拷贝判断的,只发生在对象、数组、Date、Map等引用类型上。
浅拷贝:只复制第一层,嵌套仍共用
浅拷贝不递归处理嵌套结构,适合简单合并或单层数据隔离。
- Object.assign({}, obj):兼容性好,但忽略不可枚举属性和 symbol 键
- 展开运算符 {...obj}:语法简洁,同 Object.assign 行为一致,无法处理 setter/getter
- Array.prototype.slice() / concat():仅适用于数组,对数组内对象仍为浅拷贝
JSON 方法:快但有硬限制
JSON.stringify + JSON.parse 是最轻量的深拷贝方式,仅适用于纯数据对象。
- ✅ 支持嵌套对象、数组、基本类型
- ❌ 丢失 function、undefined、Symbol、RegExp、Date(转成字符串)、BigInt
- ❌ 无法处理循环引用,直接报错
生产级深拷贝:选 fast-copy 或 cloneDeep
当项目涉及 Map、Set、Date、正则、Blob、循环引用或自定义类时,必须用专业方案。
- fast-copy:性能领先,支持 20+ 类型,自动处理循环引用,保留原型链信息,适合高频/大数据量场景
- lodash.cloneDeep:生态成熟,调试友好,但性能约为 fast-copy 的 1/2~1/5
- 手写递归函数可作为学习手段,但难以覆盖边界情况(如 WeakMap、代理对象),不建议用于生产
原型链与构造器:容易被忽略的关键点
多数深拷贝方法会丢失原始对象的 constructor 和原型链,导致 instanceof 判断失败或方法丢失。
- fast-copy 默认保留原型链,拷贝后 obj.constructor === original.constructor
- JSON 方案完全丢失原型,结果是纯 plain object
- 若需继承行为(如自定义类实例),应优先选支持构造器还原的库
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











