javascript实现深copy
function deepCopy(obj) {
if (obj == null || typeof obj !== "object") return;
let res;
if (obj instanceof Array) {
res = [];
} else {
res = {};
}
for (let key in obj) {
if (obj[key]) {
if (typeof obj[key] === "object") {
res[key] = deepCopy(obj[key]);
} else {
res[key] = obj[key];
}
}
}
return res;
}
测试:
let obj = {
name: "test",
extra: {
sex: "F"
}
};
let obj1 = deepCopy(obj);
obj1.name = "hello";
obj1.extra.sex = "M";
console.log(obj);
console.log(obj1);
循环引用深copy
function deepClone2(obj, hash = new WeakMap()) {
if (obj === null || typeof obj !== "object") return obj;
if (hash.has(obj)) return hash.get(obj);
let res;
if (obj instanceof Array) {
res = [];
} else {
res = {};
}
hash.set(obj, res);
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
if (obj[key] && obj[key] === "object") {
res[key] = deepClone3(obj[key], hash);
} else {
res[key] = obj[key];
}
}
}
return res;
}
测试