Skip to content

深浅拷贝 (Deep/Shallow Clone)

浅拷贝 Shallow Clone

浅拷贝是指:创建一个新对象,这个对象对于基本数据类型直接复制其值,对于引用类型复制其内存地址(引用)。

js
function shallowClone(target) {
  // 1. 处理基本数据类型 和 null
  if (target === null || typeof target !== "object") {
    return target;
  }

  // 2. 创建一个新的对象
  const newObject = {};

  // 3. 遍历
  for (let key in target) {
    // 4. 如果是其自身对象中的属性
    if (Object.prototype.hasOwnProperty.call(target, key)) {
      // 5. 直接赋值给新对象
      newObject[key] = target[key];
    }
  }

  // 6. 返回新的对象
  return newObject;
}

深拷贝 Deep Clone

深拷贝是指:完全复制一个对象,包括对象中的嵌套对象,创建一个与原对象完全独立的新对象,两者不共享任何内存地址。

js
function deepClone(target, map = new WeakMap()) {
  // 1. 处理简单数据类型 或者 null
  if (target === null || typeof target !== "object") {
    return target;
  }

  // 2. 边界处理,也可以是 Map 等类型
  if (target instanceof Set) {
    const newSet = new Set();
    target.forEach((v) => {
      newSet.add(v);
    });

    return newSet;
  }

  // 3. 创建新的对象或者数组
  const newObject = Array.isArray(target) ? [] : {};

  // 4. 用于解决循环引用问题
  if (map.has(target)) {
    return map.get(target);
  }
  map.set(target, newObject);

  // 5. 遍历
  for (let key in target) {
    // 6. 找到自身属性
    if (Object.prototype.hasOwnProperty.call(target, key)) {
      // 7. 递归调用或去新的值或者引用
      newObject[key] = deepClone(target[key], map);
    }
  }

  // 8. 返回 clone 后的对象
  return newObject;
}