JS深拷贝
JS实现深拷贝, 支持函数、数组、undefined、Date、RegExp、Error 等对象的深拷贝方法。以下是完整代码:
function deepClone(obj, hash = new WeakSet()) {
// 判断是否为对象
function isObject(o) {
return o != null && typeof o === 'object';
}
// 判断是否为普通对象
function isPlainObject(o) {
return o && typeof o === 'object' && Object.getPrototypeOf(o) === Object.getPrototypeOf({});
}
// 处理基本类型和特殊类型
if (!isObject(obj)) {
return obj;
}
// 处理循环引用
if (hash.has(obj)) {
return;
}
hash.add(obj);
let cloneObj;
// 根据不同的类型创建新的对象
if (Array.isArray(obj)) {
cloneObj = [];
} else if (obj instanceof Date) {
cloneObj = new Date(obj);
} else if (obj instanceof RegExp) {
cloneObj = new RegExp(obj);
} else if (obj instanceof Error) {
cloneObj = new obj.constructor(obj.message);
} else if (isPlainObject(obj)) {
cloneObj = {};
} else {
// 对于其他构造函数创建的对象,使用构造函数创建新实例
cloneObj = new obj.constructor();
}
// 遍历对象属性
Object.keys(obj).forEach(key => {
cloneObj[key] = deepClone(obj[key], hash);
});
return cloneObj;
}
// 示例
const originalObj = {
a: 1,
b: [1, 2, 3],
c: {
d: new Date(),
e: /[a-z]/,
f: [1,2,3],
g: function() { console.log('hello'); },
h: undefined,
i: [new Date(), /[a-z]/, [1,2,3]]
}
};
const clonedObj = deepClone(originalObj);
console.log(clonedObj);