← Назад ко всем вопросам

Какие знаешь способы копирования объекта в JavaScript

1️⃣ Как кратко ответить

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

2️⃣ Подробное объяснение темы

Копирование объектов в JavaScript — это важная задача, так как объекты передаются по ссылке, а не по значению. Это значит, что изменения в копии объекта могут повлиять на оригинал, если копирование выполнено неправильно. Существует несколько способов копирования объектов, которые можно разделить на поверхностное и глубокое копирование.

Поверхностное копирование

  1. 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.
  2. Оператор расширения {...obj}

    Оператор расширения также создает поверхностную копию объекта.

    const original = { a: 1, b: { c: 2 } };
    const copy = { ...original };
    
    • const copy = { ...original };: создает поверхностную копию original, аналогично Object.assign().

Глубокое копирование

  1. 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, включая вложенные объекты.
  2. Рекурсивные функции

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

    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, и выбор метода зависит от структуры данных и требований к копированию.

Тема: JavaScript
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки