多类型深拷贝

// 深拷贝:对对象内部进行深拷贝,支持 Array、Date、RegExp、DOM
const deepClone = (obj) => {
  // 如果不是对象则退出(可停止递归)
  if(typeof obj !== 'object') return;
  // 深拷贝初始值:对象/数组
  let newObj = (obj instanceof Array) ? [] : {};
  // 使用 for-in 循环对象属性(包括原型链上的属性)
  for (let key in obj) { 
    // 只访问对象自身属性
    if (obj.hasOwnProperty(key)) {
      // 当前属性还未存在于新对象中时
      if(!(key in newObj)){
        if (obj[key] instanceof Date) {
          // 判断日期类型
          newObj[key] = new Date(obj[key].getTime());
        } else if (obj[key] instanceof RegExp) {
          // 判断正则类型
          newObj[key] = new RegExp(obj[key]);
        } else if ((typeof obj[key] === 'object') && obj[key].nodeType === 1 ) {
          // 判断 DOM 元素节点
          let domEle = document.getElementsByTagName(obj[key].nodeName)[0];
          newObj[key] = domEle.cloneNode(true);
        } else {
          // 当元素属于对象(排除 Date、RegExp、DOM)类型时递归拷贝
          newObj[key] = (typeof obj[key] === 'object') ? deepClone(obj[key]) : obj[key];
        }
      }
    }
  }  
  return newObj;
}

// deepClone 函数测试效果
const objA = {
  name: 'aaa',
  birthday: new Date(),
  pattern: /a/j,
  body: document.body,
  others: [123,'coding', new Date(), /c/ee,]
};

const objB = deepCopy(objA);
console.log(objA === objB); // false

你可能感兴趣的:(多类型深拷贝)