js 手写深拷贝

170 阅读1分钟

网上查看大多手写深拷贝都有或多或少的问题,自己实现一个深拷贝,代码如下:

function _deepCLone(target) {
  let ret;
  if (target) {
    if (typeof target === "object") {
      if (Array.isArray(target)) {
        ret = [];
        for (let index = 0; index < target.length; index++) {
          const element = target[index];
          ret[index] = _deepCLone(element);
        }
      } else if (Object.prototype.toString.call(target).includes("Object")) {
        ret = {};
        for (const key in target) {
          if (Object.hasOwnProperty.call(target, key)) {
            const element = target[key];
            ret[key] = _deepCLone(element);
          }
        }
      } else {
        ret = target;
      }
    } else {
      ret = target;
    }
  } else {
    ret = target;
  }
  return ret;
}

示例:

var a = { b : {c:1,d:/$/,m:new Date()},f : function(){return 9},x:null}

var b = _deepCLone(a)

console.log(b);
// { b: {c: 1, d: /$/, m: Mon Mar 15 2021 15:49:31 GMT+0800 (中国标准时间)},
// f: ƒ (),
// x: null }