Какие знаешь способы копирования объекта в JavaScript
1️⃣ Как кратко ответить
В JavaScript объекты можно копировать несколькими способами: поверхностное копирование с помощью Object.assign() и оператора расширения {...obj}, а также глубокое копирование с использованием JSON.parse(JSON.stringify(obj)) или рекурсивных функций. Для сложных структур данных лучше использовать библиотеки, такие как Lodash.
2️⃣ Подробное объяснение темы
Копирование объектов в JavaScript — это важная задача, так как объекты передаются по ссылке, а не по значению. Это значит, что изменения в копии объекта могут повлиять на оригинал, если копирование выполнено неправильно. Существует несколько способов копирования объектов, которые можно разделить на поверхностное и глубокое копирование.
Поверхностное копирование
-
Object.assign()
Object.assign()создает поверхностную копию объекта. Это значит, что он копирует только первый уровень свойств, а вложенные объекты остаются ссылками на оригинальные объекты.const original = { a: 1, b: { c: 2 } }; const copy = Object.assign({}, original);const original = { a: 1, b: { c: 2 } };: создается объектoriginalс вложенным объектом.const copy = Object.assign({}, original);: создается поверхностная копияoriginal. Свойствоbвcopyбудет ссылаться на тот же объект, что и вoriginal.
-
Оператор расширения
{...obj}Оператор расширения также создает поверхностную копию объекта.
const original = { a: 1, b: { c: 2 } }; const copy = { ...original };const copy = { ...original };: создает поверхностную копиюoriginal, аналогичноObject.assign().
Глубокое копирование
-
JSON.parse(JSON.stringify(obj))
Этот метод создает глубокую копию объекта, но имеет ограничения: он не копирует функции, символы и объекты с циклическими ссылками.
const original = { a: 1, b: { c: 2 } }; const deepCopy = JSON.parse(JSON.stringify(original));const deepCopy = JSON.parse(JSON.stringify(original));: создает глубокую копиюoriginal, включая вложенные объекты.
-
Рекурсивные функции
Для более сложных объектов, которые содержат функции или циклические ссылки, можно написать рекурсивную функцию для глубокого копирования.
function deepClone(obj) { if (obj === null || typeof obj !== 'object') { return obj; } const copy = Array.isArray(obj) ? [] : {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { copy[key] = deepClone(obj[key]); } } return copy; } const original = { a: 1, b: { c: 2 } }; const deepCopy = deepClone(original);function deepClone(obj) {...}: определяет рекурсивную функцию для глубокого копирования.if (obj === null || typeof obj !== 'object') {...}: проверяет, является лиobjобъектом.const copy = Array.isArray(obj) ? [] : {};: создает новый объект или массив в зависимости от типаobj.for (let key in obj) {...}: итерируется по всем свойствамobj.copy[key] = deepClone(obj[key]);: рекурсивно копирует каждое свойство.
Использование библиотек
Для сложных объектов и более надежного глубокого копирования можно использовать библиотеки, такие как Lodash, которая предоставляет метод _.cloneDeep().
const _ = require('lodash');
const original = { a: 1, b: { c: 2 } };
const deepCopy = _.cloneDeep(original);
const deepCopy = _.cloneDeep(original);: создает глубокую копиюoriginalс помощью Lodash.
Копирование объектов — это важный аспект работы с данными в JavaScript, и выбор метода зависит от структуры данных и требований к копированию.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться