Sobes.tech
Назад к вопросам
Middle+
2

Из перечисленных способов копирования объекта, какие поддерживают циклические ссылки?

Компании, где спрашивали
Ifellow

Ответ от нейросети

sobes.tech AI

Циклические ссылки — это когда объект ссылается на себя напрямую или через цепочку ссылок.

Из способов копирования объектов в JavaScript:

  • Поверхностное копирование (shallow copy) — не поддерживает циклы, т.к. просто копирует ссылки.
  • Глубокое копирование через JSON.parse(JSON.stringify(obj)) — не поддерживает циклы, вызовет ошибку или бесконечный цикл.
  • Рекурсивное глубокое копирование с учётом посещённых объектов — поддерживает циклы, если реализовать механизм отслеживания уже скопированных объектов (например, с помощью WeakMap).
  • Использование специализированных библиотек (lodash.cloneDeep) — поддерживает циклы, так как внутри реализован механизм отслеживания циклических ссылок.

Пример реализации с WeakMap:

function deepClone(obj, hash = new WeakMap()) {
  if (obj === null || typeof obj !== 'object') return obj;
  if (hash.has(obj)) return hash.get(obj);

  const clone = Array.isArray(obj) ? [] : {};
  hash.set(obj, clone);

  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      clone[key] = deepClone(obj[key], hash);
    }
  }
  return clone;
}

Таким образом, поддерживают циклические ссылки только методы глубокого копирования с отслеживанием уже обработанных объектов.