function deepCopy(obj) {
// 处理基本数据类型和函数
if (obj === null || typeof obj !== 'object') {
return obj;
}
// 处理日期对象
if (obj instanceof Date) {
return new Date(obj.getTime());
}
// 处理正则表达式对象
if (obj instanceof RegExp) {
return new RegExp(obj);
}
// 处理数组
if (Array.isArray(obj)) {
const newArray = [];
for (let i = 0; i < obj.length; i++) {
newArray[i] = deepCopy(obj[i]);
}
return newArray;
}
// 处理对象
const newObj = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = deepCopy(obj[key]);
}
}
return newObj;
}
// 示例用法:
const obj1 = {
name: 'John',
age: 30,
address: {
city: 'New York',
country: 'USA'
},
hobbies: ['reading', 'sports']
};
const obj2 = deepCopy(obj1);
console.log(obj2); // 输出与 obj1 结构相同的对象
解释:
-
基本数据类型和函数的处理:
如果obj
是null
或者不是对象(如基本数据类型和函数),直接返回obj
,因为它们是不可变的。 -
特殊对象类型的处理:
如果obj
是Date
对象,通过new Date(obj.getTime())
复制日期。
如果obj
是RegExp
对象,通过new RegExp(obj)
复制正则表达式。
-
数组的处理:
如果obj
是数组,创建一个新数组newArray
,并递归地将每个元素拷贝到newArray
中。
-
对象的处理:
如果obj
是普通对象,创建一个空对象newObj
,并递归地复制每个属性到newObj
中。
-
递归调用:
- 使用递归调用
deepCopy
方法,确保所有嵌套的对象和数组都被正确地复制。
- 使用递归调用
这个方法确保了对所有数据类型的支持,并能够完整地复制对象及其嵌套的所有属性和元素。