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)