话不多说,直接上代码
let org = {a: {b: 'b'}, arr: [1,2,3, {s: 's'}]}
let res = deepClone(org);
function deepClone(obj, hash = new WeakMap()) {
if (typeof obj == null) return obj;
if (typeof obj !== "object") return obj;
if (obj instanceof RegExp) return new RegExp(obj);
if (obj instanceof Date) return new Date(obj);
// 如果obj之前被deepClone过,则直接返回之前deepClone的结果,不再去遍历obj的每个属性(可以防止循环引用崩溃)
if (hash.has(obj)) return hash.get(obj);
const copy = new obj.constructor; // 拿到obj的构造函数
hash.set(obj, copy);
for (let key in obj) {
if (obj.hasOwnProperty(key)) { // 此处只克隆了obj的私有属性,可以根据具体需求进行调整
copy[key] = deepClone(obj[key], hash); // 递归克隆
}
}
return copy;
}
org.a.b = 'c';
org.arr[3]['s'] = 'sssss';
console.log('res', res)
/*
打印结果为:{a: {b: 'b'}, arr: [1,2,3, {s: 's'}]}
*/