7 способов глубокого копирования объектов JavaScript без использования JSON.stringify и JSON.parse

Когда дело доходит до глубокого копирования объектов JavaScript, разработчики часто полагаются на методы JSON.stringify и JSON.parse для достижения желаемого результата. Однако эти методы могут быть неэффективными и некорректно обрабатывать определенные типы данных. В этой статье мы рассмотрим семь альтернативных методов глубокого копирования объектов JavaScript без использования JSON.stringify и JSON.parse. Эти методы предоставят вам больше контроля, повышенную производительность и лучшую совместимость в различных сценариях.

Метод 1: Object.assign

const originalObj = { name: 'John', age: 25 };
const copiedObj = Object.assign({}, originalObj);

Метод 2: оператор расширения

const originalObj = { name: 'John', age: 25 };
const copiedObj = { ...originalObj };

Метод 3: Object.create

const originalObj = { name: 'John', age: 25 };
const copiedObj = Object.create(Object.getPrototypeOf(originalObj), Object.getOwnPropertyDescriptors(originalObj));

Метод 4: Lodash.cloneDeep

const originalObj = { name: 'John', age: 25 };
const copiedObj = _.cloneDeep(originalObj);

Метод 5: JSON.parse с функцией восстановления

const originalObj = { name: 'John', age: 25 };
const copiedObj = JSON.parse(JSON.stringify(originalObj), (key, value) => value);

Метод 6: рекурсивная функция

function deepCopy(obj) {
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }

  const copy = Array.isArray(obj) ? [] : {};
  Object.keys(obj).forEach(key => {
    copy[key] = deepCopy(obj[key]);
  });

  return copy;
}
const originalObj = { name: 'John', age: 25 };
const copiedObj = deepCopy(originalObj);

Метод 7. Алгоритм структурированного клонирования (для Web Workers и Node.js)

const { isMainThread, Worker } = require('worker_threads');
if (isMainThread) {
  const originalObj = { name: 'John', age: 25 };
  const worker = new Worker(__filename);

  worker.on('message', copiedObj => {
    // Use the copied object
    console.log(copiedObj);
  });

  worker.postMessage(originalObj);
} else {
  const { parentPort } = require('worker_threads');

  parentPort.on('message', originalObj => {
    const copiedObj = originalObj; // Structured cloning happens automatically
    parentPort.postMessage(copiedObj);
  });
}

В этой статье мы рассмотрели семь различных методов глубокого копирования объектов JavaScript без использования JSON.stringify и JSON.parse. Эти методы обеспечивают большую гибкость, улучшенную производительность и лучшую совместимость с различными типами данных. Понимая эти альтернативы, вы можете выбрать наиболее подходящий подход для ваших конкретных требований. При выборе подходящего метода глубокого копирования для вашего проекта не забывайте учитывать такие факторы, как производительность, поддержка браузеров и читаемость кода.