286 字
1 分钟
深拷贝最新优化代码
const map = new WeakMap()
const handleArrAndObject = (varias) => {
const constructor = Object.getPrototypeOf(varias).constructor;
const object = new constructor();
for (const key in varias) {
if (Object.hasOwnProperty.call(varias, key)) {
const element = varias[key];
object[key] = deepClone(element)
}
}
return object;
}
const handleMap = (varias) => {
const constructor = Object.getPrototypeOf(varias).constructor;
const currentMap = new constructor();
varias.forEach((value, key) => {
currentMap.set(deepClone(key), deepClone(value))
})
return currentMap
}
const handleSet = (varias) => {
const constructor = Object.getPrototypeOf(varias).constructor;
const currentSet = new constructor();
varias.forEach((value) => {
currentSet.set(deepClone(value))
})
return currentSet
}
const handleRegx = (varias) => {
const constructor = Object.getPrototypeOf(varias).constructor;
const { flags, source } = varias;
const currentRegx = new constructor(source, flags);
return currentRegx;
}
const handleOthers = (varias) => {
const constructor = Object.getPrototypeOf(varias).constructor;
return new constructor(Object.prototype.valueOf.call(varias));
}
const handleFn = (vaira) => {
return vaira;
}
const cloneMap = {
'[object Array]': handleArrAndObject,
'[object Object]': handleArrAndObject,
'[object Map]': handleMap,
'[object WeakMap]': handleMap,
'[object Set]': handleSet,
'[object WeakSet]': handleSet,
'[object RegExp]': handleRegx,
'[object Function]': handleFn,
}
const getStringType = (varias) => {
return Object.prototype.toString.call(varias);
}
const getCloneVarias = (varias) => {
let fn = handleOthers;
const stringType = getStringType(varias);
if (cloneMap.hasOwnProperty(stringType)) {
fn = cloneMap[stringType]
}
return fn?.(varias);
}
const isObject = (target) => {
return typeof target === "object" && target !== null;
}
function deepClone(obj) {
if (!isObject(obj)) {
return obj;
}
if (map.get(obj)) {
return obj
}
map.set(obj, true)
return getCloneVarias(obj)
}
const obj = {
arr: [1212, 121],
name: 'weng',
name2: new String('weng'),
map: new Map(),
set: new Set(),
date: Date.now(),
regexp: new RegExp(),
string: new String(),
sayHi: () => { },
sayMyName: function () { }
}
obj.target = obj;
const obj3 = deepClone(obj);
obj3.arr[1] = 'wahahahah';
console.log(obj, obj3)
深拷贝最新优化代码
https://nollieleo.github.io/posts/深拷贝最新优化代码/
作者
翁先森
发布于
2021-12-12
许可协议
CC BY-NC-SA 4.0