克隆

2. 深度克隆

const cache = new WeakMap();
function deepClone(value) {
  if (typeof value !== "object" || value === null) {
    return value;
  }
  const cached = cache.get(value);
  if (cached) {
    return cached;
  }
  const result = Array.isArray(value) ? [] : {};
  Object.setPrototypeOf(result, Object.getPrototypeOf(value));
  cache.set(value, result);
  for (const key in value) {
    if (value.hasOwnProperty(key)) {
      result[key] = deepClone(value[key]);
    }
  }
  return result;
}

function Test() {
  this.a = 1;
  this.b = 1;
}
Test.prototype.c = 3;
const obj = new Test();

深度克隆深拷贝

function deepClone(value) {
  if (typeof value !== "object" || value === null) {
    return value;
  }
  const cached = cache.get(value);
  if (cached) {
    return cached;
  }
  const result = Array.isArray(value) ? [] : {};
  Object.setPrototypeOf(result, Object.getPrototypeOf(value));
  cache.set(value, result);
  for (const key in value) {
    if (value.hasOwnProperty(key)) {
      result[key] = deepClone(value[key]);
    }
  }
  return result;
}

深拷贝特殊玩法

function deepClone(obj) {
  return new Promise((resolve) => {
    const { port1, port2 } = new MessageChannel();
    port1.postMessage(obj);
    port2.onmessage = () => {
      resolve(msg.data);
    };
  });
}

2.1. 深拷贝循环引用问题

function deepClone(value) {
  const cache = new WeakMap();
  function _deepClone(value) {
    if (value === null || typeof value !== "object") {
      return value;
    }
    const result = Array.isArray(value) ? [] : {};
    for (let key in value) {
      if (value.hasOwnProperty(key)) {
        result[key] = _deepClone(value[key]);
      }
    }
    return result;
  }
  return _deepClone(value);
}
Last Updated:
Contributors: 刘荣杰