實現深拷貝deepCopy函數

實現

// 參數支持的數據類型
// 基礎數據類型:string,number,null,undefined,Symbol,boolean
// 引用數據類型:object,array,regexp,date,set,map
function deepCopy(obj) {
  // typeof + 哪些數據類型會返回 'object' ? ['object', 'array', 'regexp', 'date', 'set', 'map']
  let type = Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
  if (type === 'regexp') {
    return new RegExp(obj);
  }
  if (type === 'date') {
    return new Date(obj);
  }
  if (type === 'map') {
    var cloneMap = new Map();
    for (var [key, value] of obj) {
      key = typeof key === 'object' ? deepCopy(key) : key;
      value = typeof value === 'object' ? deepCopy(value) : value;
      cloneMap.set(key, value);
    }
    return cloneMap;
  }
  if (type === 'set') {
    let arr = Array.from(obj);
    var cloneSet = [];
    for (let item of arr) {
      if (typeof item === 'object') {
        cloneSet.push(deepCopy(item));
      } else {
        cloneSet.push(item);
      }
    }
    return new Set(cloneSet);
  }
  if (['object', 'array'].includes(type)) {
    var objClone = Array.isArray(obj) ? [] : {};
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
        if (obj[key] && typeof obj[key] === 'object') {
          objClone[key] = deepCopy(obj[key]);
        } else {
          objClone[key] = obj[key];
        }
      }
    }
    return objClone;
  }
  return obj;
}

測試

以下是針對拷貝前后的數據,取任意層級的引用數據類型屬性值進行對比是否相等,或者修改新數據是否會影響原數據

var arr = [1, 2, 3];
var map = new Map();
map.set(arr, [{ a: 1, b: { c: 2 } }, 2, 1])

var obj = {
  a: 1,
  b: 'str',
  c: NaN,
  d: undefined,
  e: null,
  f: false,
  g: Symbol('0'),
  h: { aa: 22 },
  i: [{ bb: 33 }, { cc: 44 }, {dd: 0}],
  j: function () { },
  k: /[a-z]/,
  l: new Date('2012-01-03 12:00:00'),
  m: new Set([{ a: 1, b: 2 }, 2, 3]),
  n: map,
}
var newObj = deepCopy(obj);
// newObj.n.set(arr,[2,2,2])
console.log(obj);
console.log(newObj);
// console.log(obj.n.get(arr)[0].b === newObj.n.get(arr)[0].b);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容