深浅拷贝(克隆)

53 阅读1分钟

最近又要开始找工作了,重温了下 深浅拷贝,特此记录,加深印象!

一. 概念

浅拷贝:如果属性是基本类型,拷贝的就是基本类型的值;如果属性是引用类型,拷贝的就是内存地址

深拷贝:新增一个新的栈,两个对象的属性完全一样,但是对应两个不同的存储地址;修改一个对象的属性, 不会影响另一个对象的属性;

二. 手写深拷贝

function deepclone(obj={}) {
  // 先判断是否为基本数据类型
  if (typeof obj !== 'object' || obj == null) {
    // 判断如果为null 或者 不为对象或数组
    return obj;
  }

 // 返回结果
  let result;
  
  // 判断是数组还是对象
  if (obj instanceof Array) {
    result = []
  } else {
    result = {}
  }

  for (let key in obj) {
    // 保证key 不是原型属性
    if (obj.hasOwnProperty(key)) {
        // 递归调用
      result[key] = deepclone(obj[key])
    }
  }

  return result;
}