JavaScript 中的深拷贝和浅拷贝
核心概念
- 浅拷贝(Shallow Copy):仅复制对象的第一层属性,引用类型属性共享内存地址
- 深拷贝(Deep Copy):递归复制对象所有层级,新旧对象完全独立
常见实现方式
浅拷贝方法
// 1. Object.assign |
深拷贝方法
// 1. JSON 序列化(有局限性) |
核心区别
特性 | 浅拷贝 | 深拷贝 |
---|---|---|
拷贝层级 | 仅第一层 | 所有嵌套层级 |
引用类型处理 | 共享内存地址 | 创建新内存空间 |
常用方法 | Object.assign/展开运算符 | JSON/递归/lodash |
性能影响 | 快 | 慢(尤其大数据量) |
应用场景 | 简单对象复制 | 需要完全独立的对象副本 |
注意事项
- JSON方法无法处理函数、Symbol、循环引用
- 递归实现需处理循环引用(使用WeakMap)
- 特殊对象类型(Date/RegExp等)需要单独处理
- 深拷贝可能影响性能(大数据量时)
- 函数属性在不同实现中的处理方式不同
使用场景
- 浅拷贝:配置项共享、简单状态管理
- 深拷贝:状态快照、不可变数据、避免副作用
评论