JS的深浅拷贝及实现?
时间: 2024-03-24 16:41:53 浏览: 13
JS 中的拷贝分为深拷贝和浅拷贝两种方式。
1. 浅拷贝:浅拷贝只是复制了原始对象的引用,而不是复制对象本身。当对象属性值为基本类型时,修改拷贝后的对象不会影响原始对象,但是当对象属性值为引用类型时,修改拷贝后的对象会影响原始对象。
浅拷贝可以通过以下方式实现:
- Object.assign() 方法
```js
let obj1 = {a: 1, b: {c: 2}};
let obj2 = Object.assign({}, obj1);
```
- 扩展运算符
```js
let obj1 = {a: 1, b: {c: 2}};
let obj2 = {...obj1};
```
- 数组的 slice() 和 concat() 方法
```js
let arr1 = [1, 2, {a: 1}];
let arr2 = arr1.slice();
let arr3 = arr1.concat();
```
2. 深拷贝:深拷贝会复制对象本身,而不是对象的引用。当对象属性值为基本类型或引用类型时,都会被完全复制,修改拷贝后的对象不会影响原始对象。
深拷贝可以通过以下方式实现:
- JSON.parse() 和 JSON.stringify() 方法
```js
let obj1 = {a: 1, b: {c: 2}};
let obj2 = JSON.parse(JSON.stringify(obj1));
```
- 手写递归实现深拷贝
```js
function deepClone(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
let result = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
result[key] = deepClone(obj[key]);
}
}
return result;
}
```
需要注意的是,使用 JSON.parse() 和 JSON.stringify() 方法进行深拷贝时,被复制的对象中不能包含函数、undefined、NaN 等类型,否则会出错。手写实现深拷贝时,要考虑循环引用的情况,以避免死循环的发生。