深复制
简单介绍
copy原理
js 中,对于赋值操作符:=
基本类型的数据:number,string,boolean 等的赋值 copy 直接是深拷贝
对于引用类型的数据:array,object 等的赋值 copy 是 copy 第一层的引用地址,操作对象始终是原对象
浅拷贝
let a = 3;
let arr = [1, 2, 3];
//浅拷贝
let b = a;
let arr2 = [...arr];
深拷贝
function deepClone(data, hash = new WeakMap()) {
if (data == undefined) return data;
if (typeof data !== "object") return data;
if (data instanceof RegExp) return new RegExp(data);
if (data instanceof Date) return new Date(data);
let v = hash.get(data);
if (v) return v;
let instance = new data.constructor();
hash.set(data, instance);
for (let key in data) {
if (data.hasOwnProperty(key)) {
instance[key] = deepClone(data[key], hash);
}
}
return instance;
}
let a = {
name: "bob",
desc: {
age: 12,
},
};
let b = deepClone(a);
b.desc.age = 100;
console.log(b);
console.log(a);
// js 循环引用
let t = {};
t.t = t;
console.log(deepClone(t));