Skip to content

深拷贝

这玩意基本有标准实现,照着社区抄完事

有的抄也不算简单,幸好现成的 api 越来越多了

js
// 考虑循环引用,使用map作为缓存
function deepClone(target, map = new WeakMap()) {
  if (
    target == null &&
    (typeof target !== "object" || typeof target !== "function")
  ) {
    return target;
  }
  if (target instanceof Date) return new Date(target);
  if (target instanceof RegExp) return new RegExp(target);

  if (map.has(target)) {
    return map.get(target);
  }
  let result = Array.isArray(target) ? [] : {};
  // let result = new target.constructor()
  map.set(target, result);
  for (const key in target) {
    result[key] = deepClone(target[key], map);
  }
  return result;
}