手写深拷贝

27 阅读1分钟

PixPin_2025-11-14_23-48-40.png

function deepClone(value, weakMap = new WeakMap()) {
  // 基础类型 & function & null 直接返回
  if (value === null || typeof value !== 'object') {
    return value;
  }

  // 循环引用处理
  if (weakMap.has(value)) {
    return weakMap.get(value);
  }

  // Date
  if (value instanceof Date) {
    return new Date(value);
  }

  // RegExp
  if (value instanceof RegExp) {
    const re = new RegExp(value.source, value.flags);
    re.lastIndex = value.lastIndex; // 复制 lastIndex
    return re;
  }

  // Map
  if (value instanceof Map) {
    const result = new Map();
    weakMap.set(value, result);
    value.forEach((v, k) => {
      result.set(deepClone(k, weakMap), deepClone(v, weakMap));
    });
    return result;
  }

  // Set
  if (value instanceof Set) {
    const result = new Set();
    weakMap.set(value, result);
    value.forEach(v => {
      result.add(deepClone(v, weakMap));
    });
    return result;
  }

  // Object 或 Array
  const result = Array.isArray(value) ? [] : Object.create(Object.getPrototypeOf(value));
  weakMap.set(value, result);

  Reflect.ownKeys(value).forEach(key => {
    result[key] = deepClone(value[key], weakMap);
  });

  return result;
}