const mapTag = '[object Map]'; const setTag = '[object Set]'; const arrayTag = '[object Array]'; const objectTag = '[object Object]'; const argsTag = '[object Arguments]'; Const boolTag = '[object Boolean]'; const dateTag = '[object Date]'; const numberTag = '[object Number]'; const stringTag = '[object String]'; const symbolTag = '[object Symbol]'; const errorTag = '[object Error]'; const regexpTag = '[object RegExp]'; const funcTag = '[object Function]'; const deepTag = [mapTag, setTag, arrayTag, objectTag, argsTag]; Function forEach(array, iteratee) {let index = -1; const length = array.length; while (++index < length) { iteratee(array[index], index); } return array; Function isObject(target) {const type = typeof target; return target ! == null && (type === 'object' || type === 'function'); } / / access type function getType (target) {return Object. The prototype. ToString. Call (target); } function getInit(target) {const Ctor = target. Constructor; return new Ctor(); } / / copy symbol type function cloneSymbol (targe) {return Object (symbol. The prototype. The valueOf. Call (targe)); } function cloneReg(targe) {const reFlags = /\w*$/; const result = new targe.constructor(targe.source, reFlags.exec(targe)); result.lastIndex = targe.lastIndex; return result; } function cloneFunction(func) { const bodyReg = /(? <={)(.|\n)+(? =})/m; const paramReg = /(? < = \ () + (? =\)\s+{)/; const funcString = func.toString(); if (func.prototype) { const param = paramReg.exec(funcString); const body = bodyReg.exec(funcString); if (body) { if (param) { const paramArr = param[0].split(','); return new Function(... paramArr, body[0]); } else { return new Function(body[0]); } } else { return null; } } else { return eval(funcString); Function cloneOtherType(targe, type) {const Ctor = targe.constructor; switch (type) { case boolTag: case numberTag: case stringTag: case errorTag: case dateTag: return new Ctor(targe); case regexpTag: return cloneReg(targe); case symbolTag: return cloneSymbol(targe); case funcTag: return cloneFunction(targe); default: return null; }} function deepClone (target, map = new WeakMap()) {// If (! isObject(target)) { return target; } // initialize const type = getType(target); let cloneTarget; if (deepTag.includes(type)) { cloneTarget = getInit(target, type); } else { return cloneOtherType(target, type); } // prevent loop references if (map.get(target)) {return map.get(target); } map.set(target, cloneTarget); // Clone set if (type === setTag) {target.forEach(value => {cloneTarget. Add (clone(value, map)); }); return cloneTarget; } // Clone map if (type === mapTag) {target.forEach((value, key) => {clonetarget. set(key, clone(value, map)); }); return cloneTarget; } // Clone objects and arrays const keys = type === arrayTag? undefined : Object.keys(target); forEach(keys || target, (value, key) => { if (keys) { key = value; } cloneTarget[key] = clone(target[key], map); }); return cloneTarget; } module.exports = { deepclone };Copy the code