实现深拷贝的方法--JS

93 阅读1分钟

实现深拷贝的两种方法:

1、JSON方法,通过转换JS对象为JSON字符串再还原为JS对象的方式实现,存在无法拷贝函数、undefined、循环引用等问题

2、递归拷贝方法,通过递归实现深拷贝保持原始内容,不会丢失属性

// 深拷贝的方法

// 1、JSON 方法
// 存在的问题:无法拷贝函数、undefined、循环引用等
const obj1 = {
  a: 1,
  b: [10, 20, 30],
  c: undefined,
  d: function () { return 42; }
}
// 打印后,obj1.c 和 obj1.d 会丢失
console.log(JSON.parse(JSON.stringify(obj1)));

// 2、递归拷贝
function deepCopy(obj) {
  // 如果是原始类型或函数,直接返回
  if (obj === null || typeof obj !== 'object') {
    return obj;
  }
  // 处理数组或对象
  else {
    const copy = Array.isArray(obj) ? [] : {}
    for (let key in obj) {
      // 确保是对象自身的属性
      if (obj.hasOwnProperty(key)) {
        // 递归拷贝
        copy[key] = deepCopy(obj[key]);
      }
    }
    // 返回拷贝后的对象
    return copy;
  }
}
// 拷贝后,obj1.c 和 obj1.d 依然存在
const obj2 = deepCopy(obj1)
console.log(obj2, obj2.d());