Как выполнить глубокое клонирование объекта в JavaScript? Какие варианты существуют, какой выберешь и почему?

Обратите внимание, что в исходном коде были вызовы () в массиве, которые не валидны, я заменил их на null для корректности.

Короткий ответ

Что ответить на собеседовании

Обратите внимание, что в исходном коде были вызовы () в массиве, которые не валидны, я заменил их на null для корректности.

Подробный разбор

Ответ с пояснениями

Для реализации глубокого клонирования без использования JSON.parse(JSON.stringify(...)) можно написать рекурсивную функцию, которая будет копировать объекты, массивы и примитивы. Важно учитывать циклические ссылки и типы данных, но для упрощения примера реализуем базовый вариант без поддержки циклов.

function cloneDeep(something: any): any {
  if (something === null || typeof something !== 'object') {
    return something; // Примитивы возвращаем как есть
  }

  if (Array.isArray(something)) {
    return something.map(item => cloneDeep(item));
  }

  const clonedObj: any = {};
  for (const key in something) {
    if (Object.prototype.hasOwnProperty.call(something, key)) {
      clonedObj[key] = cloneDeep(something[key]);
    }
  }
  return clonedObj;
}

function assertDeep(a: any, b: any) {
  if (JSON.stringify(a) !== JSON.stringify(b)) {
    console.error("Not OK");
  } else {
    console.log("OK");
  }
}

const obj = {
  a: 1,
  b: true,
  c: "hello",
  d: {
    there: "are",
    some: ["properties"]
  },
  e: {},
  f: [null, null, { key: { value: [1, 2, "3", "four"] } }],
  g: []
};

assertDeep(obj, cloneDeep(obj));

Обратите внимание, что в исходном коде были вызовы () в массиве, которые не валидны, я заменил их на null для корректности.

Этот код рекурсивно копирует объекты и массивы, создавая глубокую копию без использования JSON-сериализации.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее