js实现对象的深浅拷贝
时间: 2023-12-03 15:54:46 浏览: 40
浅拷贝:
1. 使用 Object.assign(target, source) 方法,将 source 对象的所有可枚举属性复制到 target 对象中,如果 target 对象已经存在相同属性,则会被覆盖。
```javascript
let source = { name: 'Tom', age: 18 };
let target = {};
Object.assign(target, source);
console.log(target); // { name: 'Tom', age: 18 }
```
2. 使用展开运算符(...)进行浅拷贝。
```javascript
let source = { name: 'Tom', age: 18 };
let target = { ...source };
console.log(target); // { name: 'Tom', age: 18 }
```
深拷贝:
1. 使用 JSON.parse(JSON.stringify(obj)) 方法进行深拷贝,该方法会将对象转换为 JSON 字符串,再将字符串转换为新的对象,从而实现深拷贝。但是该方法存在一些限制:不能拷贝函数、RegExp 等特殊对象,而且对象循环引用时会出错。
```javascript
let source = { name: 'Tom', age: 18, hobbies: ['swimming', 'reading'], friend: { name: 'Jerry', age: 17 } };
let target = JSON.parse(JSON.stringify(source));
console.log(target); // { name: 'Tom', age: 18, hobbies: ['swimming', 'reading'], friend: { name: 'Jerry', age: 17 } }
```
2. 使用递归实现深拷贝,遍历对象的所有可枚举属性,如果属性值是对象,则递归调用深拷贝函数进行拷贝。
```javascript
function deepClone(obj) {
let result = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object' && obj[key] !== null) {
result[key] = deepClone(obj[key]);
} else {
result[key] = obj[key];
}
}
}
return result;
}
let source = { name: 'Tom', age: 18, hobbies: ['swimming', 'reading'], friend: { name: 'Jerry', age: 17 } };
let target = deepClone(source);
console.log(target); // { name: 'Tom', age: 18, hobbies: ['swimming', 'reading'], friend: { name: 'Jerry', age: 17 } }
```