深拷贝-拷贝对象,数组,方法,正则都ok

696 阅读1分钟

深拷贝的作用就是为了让新拷贝出来的结果clone的修改不会影响到原来的对象obj

测试数据

var person = {
  name: 'kehao',
  age: 18,
  sister: ['marry', 'lisa'],
  borther: {
    big: {
      name: 'enhao',
      age: 23
    }
  },
  say: function() {
    console.log('hello future')
  },
  reg: /[0-9]{2,3}/g,
  date: new Date()
}

克隆function

	
function deepClone(obj) {
  // 如果obj为undefined或null直接返回
  if (!obj) return obj;
  // 从obj的constructor来new一个和obj相同类型的实例
  var clone = new obj.constructor();
  // 如果obj不是对象,直接返回
  if (typeof obj !== 'object')
    return obj;
  // 说明是对象,那就遍历他的每一个键i,【for...in会遍历到原型上的属性】
  for (var i in obj) {
    // 值拷贝自己的成员给clone,不拷贝原型上的东西给clone
    if (obj.hasOwnProperty(i)) {
      if (obj[i] instanceof Date) {
      	// 如果是Date类型,就重新new一个实例在给clone[i]
        clone[i] = new Date(obj[i]);
      } else if (obj[i] instanceof RegExp) {
      	// 如果是RegExp类型,就重新new一个实例在给clone[i]
        clone[i] = new RegExp(obj[i]);
      } else if (typeof obj[i] !== 'object') {
      	// 如果不是object类型的,直接复制给clone[i]
        clone[i] = obj[i];
      } else if (typeof obj[i] === 'object') {
      	// 如果obj[i]还是一个object类型的,就递归
        clone[i] = deepClone(obj[i])
      }
    }
  }
  // 返回克隆后的结果
  return clone;
}

测试数据

var cloneObj = deepClone(person);
console.log(cloneObj);

cloneObj.name = 'jakequc'

console.log('person:', person)
console.log('cloneObj:', cloneObj)

结语: 如果本文存在错误,欢迎指正,thank you