面试之——要【深】?【浅】:拷贝

137 阅读1分钟

📐拷贝[copy]

简言之,把它复制过来。为啥分为“浅”和“深”呢?

这就得从数据类型说起了,简单数据类型很简单存储在小栈中,而引用数据类型就不一样了,存储在中不要紧,在我们需要调用数据时只能取到它的引用地址,利用地址处理数据。


✍🏻浅拷贝

只拷贝最外面一层,更深层次级别的对象只拷取引用。

es5:中拷贝采取`for in`循环 
es6:Object.assign(targetObj,sourceObj)


var a = 1;
b = a; // 栈内存会开辟一个新的内存空间,此时b和a都是相互独立的
b = 2;
console.log(a); // 1

✍🏻深拷贝

完全拷贝,包括引用对象。

终极解决方案:递归

const obj = {
  name: '雷军',
  works: '小米10',
  sister: {
    name: '雷布斯',
    age: 90
  },
  function() {
    console.log('小米为发烧而生')
  }
}

function deepClone(obj) {
  var cloneObj = Array.isArray(obj) ? [] : {}
  if (obj && typeof obj === 'object') {
    for (key in obj) {
      if (obj[key] && typeof obj[key] === 'object') {
        cloneObj[key] = deepClone(obj[key])
      } else {
        cloneObj[key] = obj[key]
      }
    }
  }
  return cloneObj
}

const newObj = deepClone(obj)
newObj.sister.name = '王炸'
console.log(newObj.sister.name) // 王炸
-------------------------------------------------------------------------
通过JSON对象来实现深拷贝

const obj1=JSON.parse(JSON.stringfy(obj))
console.log(obj1) // 丢失sister对象以及function函数 

缺点:对象中的深拷贝为undefined

👍总结

 如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生
 变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。