以下是一个实现深拷贝的 JavaScript 函数:
function deepClone(obj) {
// 如果是基本数据类型,直接返回
if (obj === null || typeof obj !== 'object') {
return obj;
}
// 创建一个新对象或数组,保持原对象的类型
let copy;
if (obj instanceof Array) {
copy = [];
} else {
copy = {};
}
// 遍历原对象的属性或数组的元素
for (let key in obj) {
// 忽略原型链上的属性
if (obj.hasOwnProperty(key)) {
// 递归调用,对每个元素或属性值进行深拷贝
copy[key] = deepClone(obj[key]);
}
}
return copy;
}
// 示例用法
const obj1 = {
a: 1,
b: [2, 3],
c: { d: 4 },
e: new Date(), // 深拷贝特殊对象
f: function () {}, // 函数在深拷贝中会丢失其行为
g: new RegExp('test') // 正则表达式等也会被拷贝
};
const obj2 = deepClone(obj1);
console.log(obj2);
这个函数通过递归的方式对嵌套的对象和数组进行深拷贝,对于基本数据类型直接返回。需要注意的是,在 JavaScript 中,像函数和某些特殊对象(如 Date、RegExp 等)的深拷贝处理可能需要注意一些细节,这个示例代码在拷贝这些对象时可能不会完全保留其所有特性,但可以作为一个基础的深拷贝实现来学习和调整。