Back to questions
Middle
5
Есть объект, некоторые значения которого — функции. Как сделать его глубокую копию? Есть ли сложности?
Companies where asked
Data World
Answer from AI
sobes.tech AI
Глубокое копирование объекта с функциями в JavaScript — задача нетривиальная, так как стандартные методы (например, JSON.parse(JSON.stringify(obj))) не копируют функции.
Чтобы сделать глубокую копию с сохранением функций, можно использовать рекурсивный обход объекта и копирование каждого свойства:
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') {
return obj; // Примитивы и функции возвращаем как есть
}
if (typeof obj === 'function') {
return obj.bind({}); // Можно просто вернуть функцию или создать биндинг
}
if (Array.isArray(obj)) {
return obj.map(deepClone);
}
const clonedObj = {};
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
clonedObj[key] = deepClone(obj[key]);
}
}
return clonedObj;
}
Сложности:
- Функции копируются по ссылке, так как их внутреннее состояние (замыкания) нельзя клонировать.
- Если функции зависят от внешнего контекста, копия может работать иначе.
- Циклические ссылки требуют дополнительной обработки (например, с помощью WeakMap).
Таким образом, глубокое копирование с функциями возможно, но функции копируются как ссылки, и это стоит учитывать.