js深拷贝,包含特殊类型拷贝
function deepCopy(obj, map = new WeakMap()) {
if (typeof obj === 'object' && obj !== null) {
if (map.has(obj)) {
return map.get(obj);
}
map.set(obj, obj);
let res = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
value = obj[key];
res[key] = deepCopy(value, map);
}
}
if (!Array.isArray(res) && !Object.keys(res).length) {
res = new obj.constructor(obj);
}
return res;
}
else {
return obj
}
}
// 测试数据
var test = { name: "test", d: {age: 12} };
test.x = test;
var data = {
a: "123",
b: 123,
c: true,
d: [43, 2],
e: undefined,
f: null,
g: function () { console.log("g"); },
h: new Set([3, 2, null]),
i: Symbol("fsd"),
j: test,
k: new Map([["name", "张三"], ["title", "Author"]])
};
deepCopy(data);