手写深拷贝

# 手写深拷贝

浅拷贝:仅仅是复制了引用,彼此之间的操作会互相影响

Array 的 sliceconcat 方法并不是真正的深拷贝,对于 Array 的第一层的元素是深拷贝,而 Array 的第二层 sliceconcat 方法是复制引用。所以 Array 的 sliceconcat 方法都是浅拷贝。

深拷贝:在堆中重新分配内存,不同的地址,相同的值,互不影响

JSON.parse() 和 JSON.stringify()

JSON.stringify() 把一个 js 对象序列化为一个 JSON 字符串 JSON.parse() 把 JSON 字符串反序列化为一个 js 对象

手写深拷贝:利用递归来实现对对象或数组的深拷贝

递归思路:对属性中所有引用类型的值进行遍历,直到是基本类型值为止。

function deepCopy(obj) {
  if (!obj && typeof obj !== 'object') {
    throw new Error('error arguments');
  }
  // const targetObj = obj.constructor === Array ? [] : {};
  const targetObj = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
    //只对对象自有属性进行拷贝
    if (obj.hasOwnProperty(key)) {
      if (obj[key] && typeof obj[key] === 'object') {
        targetObj[key] = deepCopy(obj[key]);
      } else {
        targetObj[key] = obj[key];
      }
    }
  }
  return targetObj;
}
LOSER
米津玄師