javascript深度复制,适合大部分数据情况,可多层嵌套对象,有其他不支持的类型,请留言,我会进行完善
const deepClone = function(obj, hashWeakMap = new WeakMap()) {
if (obj === null) {
return null;
}
if (!['[object Object]', '[object Array]'].includes(Object.prototype.toString.call(obj))) {
return obj;
}
if (hashWeakMap.has(obj)) {
return hashWeakMap.get(obj);
}
const resObj = Array.isArray(obj) ? [] : {};
hashWeakMap.set(obj, resObj);
Reflect.ownKeys(obj).forEach(key => {
resObj[key] = deepClone(obj[key], hashWeakMap);
});
return resObj;
};
测试字符
const oldObject = {
s: 1,
b: '2',
f: true,
d: new Date(),
r: /^1[0-9]{10}/,
f: new Boolean(true),
m: [
1,
23,
5,
6,
() => {
return { t: 's', m: 'p' };
}
],
p: {
s: '1',
l: '2',
q: () => {
console.log('123');
}
},
count: 0,
[Symbol.iterator]: () => {
return {
next: () => {
if (oldObject.count < 10) {
oldObject.count++;
return {
done: false,
value: oldObject.count
};
}
return {
done: true,
value: oldObject.count
};
}
};
}
};
oldObject.target = oldObject;
测试结果
