手写深拷贝、浅拷贝

(一)浅拷贝

var obj1 = {
   name: 'zs',
   school: 'qq',
   major: {
     math: 'gs'
   }
}
var obj2 = obj1
obj1.major.math = 'zh'
console.log(obj2.major.math) // zh

两个对象指向同一个引用地址,其中一个变了,其他对象的相应字段也都会改变,这是浅拷贝

(二)深拷贝

深拷贝实现的目的就是:其中一个变了,其他对象的相应字段不会改变,仍然保持原有的值,这是深拷贝,深拷贝的原理就是为对象重新开辟内存空间,然后把其需要参照的对象循环复制,存入新的内存中

var obj1 = {
  name: 'zz',
  age: 23,
  arr: [1, 2, 3],
  major: {
    main: 'computer',
    other: 'math',
    majorArr: [1, 2, 3],
  }
}

// 深拷贝 针对数组和对象
function deepClone (target) {
  // 如果不是数组或者对象直接返回
  if (typeof target !== 'object') {
    return target
  }

  let newData;
  if (target instanceof Object) {
    newData = {}
  }
  if (target instanceof Array) {
    newData = []
  }

  for (let key in target) {
    // hasOwnProperty
    if (target.hasOwnProperty(key)) {
      newData[key] = deepClone(target[key]) // 递归!!对象的值是对象也需要处理
    }
  }
  
  return newData
}

var obj2 = deepClone(obj1)

obj1.major.other = 333
obj1.arr[0] = 344
obj1.major.majorArr[1] = 399 
console.log(obj2)
console.log(obj1)

可以看出 obj1 是 obj1,obj2 是 obj2,互不影响,这就是深拷贝

猜你喜欢

转载自blog.csdn.net/Luckyzhoufangbing/article/details/108580520