Назад к вопросам
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;
}
Таким образом, поддерживают циклические ссылки только методы глубокого копирования с отслеживанием уже обработанных объектов.