初级版本:
function deepClone_v1(obj) {
if (typeof obj !== "object" || obj == null) {
return obj;
}
let result;
if (Array.isArray(obj)) {
result = [];
} else {
result = {};
}
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
result[key] = deepClone(obj[key]);
}
}
return result;
}
高级版本:
<script>
function deepClone_v2(obj, map = new WeakMap()) {
if (typeof obj !== "object" || obj == null) {
return obj;
}
let objRef = map.get(obj);
if (objRef) {
return objRef;
}
let target = {};
map.set(obj, target);
// Map
if (obj instanceof Map) {
target = new Map();
obj.forEach((v, k) => {
let v1 = deepClone_v2(v, map);
let k1 = deepClone_v2(k, map);
target.set(k1, v1);
});
}
// Set
if (obj instanceof Set) {
target = new Set();
obj.forEach((v) => {
let v1 = deepClone_v2(v, map);
target.add(v1);
});
}
// Array
if (obj instanceof Array) {
target = obj.map((item) => deepClone_v2(item, map));
}
// Object
for (let k in obj) {
let v1 = deepClone_v2(obj[k], map);
target[k] = v1;
}
return target;
}
// 下面是测试代码
let obj = {
map: new Map([
["name", "foo"],
["age", 20],
]),
set: new Set(["basketball", "football"]),
address: {
city: "bj",
},
sayHello: () => {
console.log("Hello World!");
},
};
obj.self = obj;
console.log(deepClone_v2(obj));
</script>