### **深拷贝与浅拷贝详解**
---
### **一、核心区别**
| **对比维度** | **浅拷贝(Shallow Copy)** | **深拷贝(Deep Copy)** |
|--------------|-----------------------------------------------|---------------------------------------------|
| **复制层级** | 仅复制对象的第一层属性 | 递归复制对象的所有层级属性 |
| **引用处理** | 引用类型属性共享内存地址(修改会相互影响) | 引用类型属性创建独立副本(完全隔离) |
| **性能** | 快(仅复制表层数据) | 慢(需遍历所有嵌套结构) |
| **内存占用** | 低 | 高 |
---
### **二、实现方式与代码示例**
#### **1. JavaScript 实现**
- **浅拷贝**
```javascript
// 方法1:Object.assign
const obj = { a: 1, b: { c: 2 } };
const shallowCopy = Object.assign({}, obj);
// 方法2:展开运算符(...)
const shallowCopy2 = { ...obj };
```
**测试影响**:
```javascript
shallowCopy.b.c = 999;
console.log(obj.b.c); // 输出 999(原对象被修改)
```
- **深拷贝**
```javascript
// 方法1:JSON.parse(JSON.stringify())(局限性:无法处理函数、循环引用)
const deepCopy = JSON.parse(JSON.stringify(obj));
// 方法2:Lodash 库的 cloneDeep
import _ from 'lodash';
const deepCopy2 = _.cloneDeep(obj);
```
**测试影响**:
```javascript
deepCopy.b.c = 888;
console.log(obj.b.c); // 输出 2(原对象未受影响)
```
#### **2. Python 实现**
- **浅拷贝**
```python
import copy
original = [[1, 2], [3, 4]]
shallow_copy = copy.copy(original)
```
**测试影响**:
```python
shallow_copy[0][0] = 99
print(original) # 输出 [[99, 2], [3, 4]]
```
- **深拷贝**
```python
deep_copy = copy.deepcopy(original)
```
**测试影响**:
```python
deep_copy[0][0] = 88
print(original) # 输出 [[99, 2], [3, 4]](原对象不变)
```
---
### **三、典型应用场景**
| **场景** | **推荐拷贝方式** | **原因** |
|------------------------|------------------|------------------------------------------|
| 配置对象复用 | 浅拷贝 | 快速生成配置模板,共享部分引用数据 |
| 状态管理(如 Redux) | 深拷贝 | 确保状态独立,避免意外修改历史状态 |
| 临时数据快照 | 浅拷贝 | 仅需短期隔离顶层数据,节省性能 |
| 嵌套结构数据持久化 | 深拷贝 | 避免存储时引用丢失导致数据不完整 |
---
### **四、深拷贝的局限性及解决方案**
1. **循环引用问题**
- **现象**:对象属性间接引用自身,导致递归无限循环。
- **解决**:使用哈希表记录已拷贝对象。
```javascript
function deepCopy(obj, hash = new WeakMap()) {
if (hash.has(obj)) return hash.get(obj);
// 递归拷贝逻辑...
}
```
2. **特殊对象处理**
- **函数**、**DOM 元素**、**Date** 等需特殊处理:
```javascript
if (obj instanceof Date) return new Date(obj);
if (obj instanceof HTMLElement) return obj.cloneNode(true);
```
---
### **五、性能优化建议**
1. **按需深拷贝**
- 仅对可能被修改的嵌套属性进行深拷贝。
2. **结构化克隆**
- 使用浏览器原生 `structuredClone()`(支持大部分数据类型):
```javascript
const cloned = structuredClone(original);
```
---
### **六、总结**
- **浅拷贝**:轻量高效,适用于简单数据隔离场景。
- **深拷贝**:彻底隔离数据,适合复杂对象或严格的数据独立性需求。
- **选择依据**:根据数据结构的复杂度、性能要求和业务场景综合判断。