深拷贝与浅拷贝的区别

浅拷贝:

创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。

深拷贝:

创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。

浅拷贝的实现(Object.assign):

let x = {
  a: 1,
  b: {f:{g:1}},
  c: [1,2,3]
}
let y = Object.assign({},x)
console.log(y.b.f === x.b.f); //true
复制代码

深拷贝的两种实现方式:

方式一:JSON.parse(JSON.stringify(copyObj))

「优点」:使用简单

「缺点」

  • 如果对象里的函数,正则,date无法被拷贝下来。
  • 无法拷贝copyObj对象原型链上的属性和方法。
  • 当数据的层次很深,会栈溢出。

方式二:手写拷贝

「优点」:可以考虑到各种情况

「缺点」:实现较为复杂

// 手写深拷贝函数
function deepClone(obj) {
  if(typeof obj !== 'object' || obj == null) {
    return obj;
  }
  let objClone;
  if(obj instanceof Array) {
    objClone = [];
  }
  else {
    objClone = {};
  }
  for(let key in obj) {
    if(obj.hasOwnProperty(key)) {
      // 如果还是对象,就递归
      if(obj[key] && typeof obj[key] === "object") {
        objClone[key] = deepClone(obj[key]);
      } else {
        objClone[key] = obj[key];
      }
    }
  }
  return objClone
}

// 测试
let person = {
    name: 'zhangsan',
    friends: {
      name: 'lisi'
    }
}
let person2 = deepClone(person)
person2.friends.name = 'wangwu'
console.log(person);
console.log(person2);
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享