4.深拷贝和浅拷贝如何实现?
时间: 2024-10-15 13:02:03 浏览: 27
在JavaScript中,"深拷贝"(Deep Copy)和"浅拷贝"(Shallow Copy)是两种复制数据对象的方式,它们的区别在于是否对嵌套的对象或数组也进行复制。
**浅拷贝**:
- 对于基本类型的值(如数字、字符串),它们本身就是值类型,浅拷贝就是简单的赋值,新旧变量指向的是同一个内存地址。
- 对于复杂类型(如对象和数组),浅拷贝只是创建了一个新的引用,并复制了原始对象的第一层属性或元素,第二层及更深层次的数据仍然是引用。
在JavaScript中,最常用的浅拷贝方法有:
- 对象字面量 `{}` 和 `Array.from()`
- `JSON.parse()` 和 `JSON.stringify()` (适用于非函数、日期等可以序列化的对象)
- 对象扩展运算符 `...`
示例:
```javascript
let shallowCopyObj = { a: [1, 2], b: 'hello' };
let shallowCopiedObj = {...shallowCopyObj}; // 浅拷贝,b仍是原引用
shallowCopyObj.b = 'world';
console.log(shallowCopiedObj); // 输出:{ a: [1, 2], b: 'world' }
```
**深拷贝**:
- 如果需要完全复制对象的所有内容,包括嵌套的对象和数组,你需要使用递归或者专门的库,如 `lodash.cloneDeep()` 或 `Object.assign()` 结合循环。
- 对于复杂对象,深拷贝会创建全新的实例,并复制所有的属性值,包括嵌套的属性和数组元素。
深拷贝示例:
```javascript
import clone from 'lodash/fp/clone'; // 使用lodash库
let deepCopyObj = { a: [1, 2], b: { c: 'hello' } };
let deepCopiedObj = clone(deepCopyObj);
deepCopyObj.a.push(3);
deepCopyObj.b.c = 'world';
console.log(deepCopiedObj); // 输出:{ a: [1, 2, 3], b: { c: 'hello' } }
```
阅读全文