深拷贝

深拷贝是指复制一个对象时,不仅复制对象本身的属性,而且递归复制对象属性的值。通俗的说,深拷贝将一个对象完全复制一份,并且新对象的修改不会影响原对象。

实现深拷贝的方法有很多,以下是两种常见的方式:

  1. 递归实现深拷贝

通过递归遍历需要拷贝的对象,当遇到子对象时进行深度遍历,将子对象也进行深拷贝。可以通过判断变量类型的方法来实现区分,将除Object和Array外的其他类型直接赋值即可。

function deepClone(obj) {
  if (obj === null || typeof obj !== 'object') {
    return obj;
  }

  let result = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      result[key] = deepClone(obj[key]);
    }
  }
  return result;
}
  1. 利用JSON实现深拷贝

由于JSON数据格式本身就是能够表达JavaScript中的对象的语法,因此可以将复杂对象通过JSON.stringify()方法转化为JSON字符串,再通过JSON.parse()方法将JSON字符串转化为新的对象。由于JSON.stringify()方法会将对象中的函数和undefined值忽略掉,因此不适用于直接拷贝包含函数和undefined值的对象。

function deepClone(obj) {
  return JSON.parse(JSON.stringify(obj));
}

需要注意的是,深拷贝可能会存在循环引用的问题,指向自身或指向同一个对象,这种情况需要进行特殊的处理,例如通过WeakMap来记录已经遍历过的对象,遇到已经遍历过的对象时直接返回对应的值。

posted @ 2023-05-31 07:28  kitebear  阅读(15)  评论(0编辑  收藏  举报