js 实现深拷贝
时间: 2023-07-12 16:09:30 浏览: 43
实现深拷贝可以使用递归的方式:
```javascript
function deepCopy(obj) {
if (typeof obj !== 'object') {
// 如果不是对象类型,则直接返回
return obj;
}
// 创建一个新的对象或数组
const newObjOrArr = Array.isArray(obj) ? [] : {};
// 遍历对象或数组
for (let key in obj) {
// 如果属性值是对象或数组,则递归进行深拷贝
newObjOrArr[key] = deepCopy(obj[key]);
}
return newObjOrArr;
}
```
使用示例:
```javascript
const obj = {
name: 'Alice',
age: 20,
hobby: ['reading', 'music'],
address: {
city: 'Beijing',
street: 'Chaoyang',
},
};
const newObj = deepCopy(obj);
console.log(newObj);
```
注意:这种实现方式不能处理循环引用的情况。
相关问题
javascript实现深拷贝
深拷贝是指将一个对象完整地拷贝一份,不受原对象影响,可以通过以下几种方式实现:
1. 递归实现
```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;
}
```
2. JSON序列化实现
```javascript
function deepClone(obj) {
return JSON.parse(JSON.stringify(obj));
}
```
但需要注意的是,JSON序列化无法处理函数、正则表达式等特殊类型的数据。
使用js实现深拷贝
在 JavaScript 中,深拷贝指的是创建一个新的对象,并将原始对象和其所有嵌套的属性和子属性的值都复制到新对象中。可以使用递归函数来实现深拷贝。下面是一个简单的实现:
```javascript
function deepCopy(obj) {
// 如果是基本类型或者是 null,直接返回
if (typeof obj !== 'object' || obj === null) {
return obj;
}
// 根据 obj 的类型创建一个新的对象
let newObj = Array.isArray(obj) ? [] : {};
// 遍历 obj 的所有属性进行复制
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = deepCopy(obj[key]);
}
}
return newObj;
}
```
使用示例:
```javascript
let obj1 = {
name: 'Tom',
age: 18,
hobbies: ['reading', 'music'],
address: {
province: 'Guangdong',
city: 'Shenzhen'
}
};
let obj2 = deepCopy(obj1);
obj2.name = 'Jerry';
obj2.hobbies.push('swimming');
obj2.address.city = 'Guangzhou';
console.log(obj1); // { name: 'Tom', age: 18, hobbies: [ 'reading', 'music' ], address: { province: 'Guangdong', city: 'Shenzhen' } }
console.log(obj2); // { name: 'Jerry', age: 18, hobbies: [ 'reading', 'music', 'swimming' ], address: { province: 'Guangdong', city: 'Guangzhou' } }
```
可以看到,obj2 是 obj1 的深拷贝,修改 obj2 的值不会影响到 obj1。