大厂面试题:深拷贝是什么?

深拷贝是什么

深拷贝(deep copy)是指在复制一个对象时,不仅复制对象本身的值或引用。

大厂面试题:深拷贝是什么?-mikechen

与浅拷贝(shallow copy)不同,浅拷贝仅复制对象的第一层属性。

对于嵌套的可变引用仍指向原始对象的子对象,而深拷贝确保原对象与新对象在结构上互不影响,修改其一不会导致另一个的状态改变。

 

深拷贝有什么价值

深拷贝的主要作用包括:

大厂面试题:深拷贝是什么?-mikechen

第一,避免共享可变数据带来的副作用与隐蔽错误,尤其在并发、异步或模块化程序中保障数据隔离性;

第二,便于实现对象的安全快照、撤销/重做、序列化与持久化操作;

第三,支持独立复制复杂数据结构(如树、图、嵌套数组或字典),以便在不同上下文中安全使用。

 

深拷贝实现原理

不同语言写法不同,但底层理念高度相似,关键有两点:开辟新内存 + 递归复制引用对象。

递归/遍历对象图:

function deepCopy(obj, visited = new WeakMap()) {
  // 处理基本类型和 null
  if (obj === null || typeof obj !== 'object') return obj;

  // 处理循环引用:如果已经拷贝过,直接返回之前的结果
  if (visited.has(obj)) return visited.get(obj);

  // 处理特殊对象
  if (obj instanceof Date) return new Date(obj);
  if (obj instanceof RegExp) return new RegExp(obj.source, obj.flags);
  if (obj instanceof Map) {
    const copy = new Map();
    visited.set(obj, copy);
    obj.forEach((value, key) => copy.set(key, deepCopy(value, visited)));
    return copy;
  }
  if (obj instanceof Set) {
    const copy = new Set();
    visited.set(obj, copy);
    obj.forEach(value => copy.add(deepCopy(value, visited)));
    return copy;
  }

  // 处理数组和普通对象
  const copy = Array.isArray(obj) ? [] : {};
  visited.set(obj, copy);

  // 递归拷贝可枚举属性(包括 Symbol)
  Reflect.ownKeys(obj).forEach(key => {
    copy[key] = deepCopy(obj[key], visited);
  });

  return copy;
}

从源对象开始,依次访问每个字段:基本类型直接拷贝数值。

引用类型则继续创建新对象并复制其内部字段,如此递归直到最底层的基本类型。

这样构建出一棵与原对象结构相同、但全部节点都是新内存的对象树。

mikechen睿哥

10年+一线大厂架构实战经验,就职于阿里、淘宝等一线大厂,操盘多个亿级大厂核心项目。

评论交流
    说说你的看法