帮我用js写一个深浅拷贝
时间: 2024-05-09 19:19:19 浏览: 21
深拷贝和浅拷贝是指在复制对象时,是否只复制对象的引用,还是复制对象的所有值。以下是使用 JavaScript 实现深拷贝和浅拷贝的示例代码:
浅拷贝:
```javascript
function shallowCopy(obj) {
var newObj = {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = obj[key];
}
}
return newObj;
}
```
深拷贝:
```javascript
function deepCopy(obj) {
var newObj = {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object') {
newObj[key] = deepCopy(obj[key]);
} else {
newObj[key] = obj[key];
}
}
}
return newObj;
}
```
需要注意的是,以上两种方法仅适用于纯 JavaScript 对象,对于包含函数、原型链等复杂结构的对象可能会出现错误。在实际应用中,建议使用成熟的第三方库来完成深拷贝和浅拷贝操作。
相关问题
JavaScript 深浅拷贝?
深拷贝和浅拷贝是 JavaScript 中常用的两种对象复制方法。
浅拷贝只会复制对象的一层属性,如果对象的属性值是一个引用类型,那么只会复制这个引用,两个对象会共享同一个引用类型的属性。常见的浅拷贝方法有 Object.assign() 和展开运算符(...)。
深拷贝则会复制整个对象,并且每个属性值都会被复制一份,不会共享同一个引用类型的属性。常见的深拷贝方法有 JSON.parse(JSON.stringify(obj)) 和递归复制对象属性。
需要注意的是,使用 JSON.parse(JSON.stringify(obj)) 进行深拷贝时,如果对象中含有函数、RegExp 等类型的属性,会被转成 null。另外,如果对象中存在循环引用,也会导致 JSON.stringify() 函数报错。
js实现对象的深浅拷贝
浅拷贝:
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 } }
```