Перечислите все способы копирования объектов?

Этот вопрос проверяет знание различных способов создания копий объектов, что важно для работы с изменяемыми данными без изменения исходных объектов.

Короткий ответ

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

Длинный ответ

В JavaScript есть несколько способов копирования объектов, и они делятся на поверхностные и глубокие копии.

 

  1. Поверхностные копии:
    • Object.assign(): Создает новую копию объекта, копируя свойства только верхнего уровня. Вложенные объекты копируются по ссылке.

      let original = { a: 1, b: { c: 2 } }; 
      let copy = Object.assign({}, original); 
      copy.b.c = 3; 
      console.log(original.b.c); // 3, так как вложенный объект скопирован по ссылке.

       

    • Оператор расширения (...): Работает аналогично Object.assign(), создавая поверхностную копию объекта.

      let original = { a: 1, b: { c: 2 } }; 
      let copy = { ...original };
  2.  
  3. Глубокие копии:
    • JSON.parse(JSON.stringify()): Простой способ создать глубокую копию, однако он не работает с функциями и другими специальными объектами (например, Date, Map, Set).

      let original = { a: 1, b: { c: 2 } }; 
      let copy = JSON.parse(JSON.stringify(original)); 
      copy.b.c = 3; 
      console.log(original.b.c); // 2, так как объект был полностью скопирован.

       

    • Рекурсивная функция: Для создания глубокой копии, которая корректно работает со сложными структурами, можно использовать рекурсивные функции или специальные библиотеки вроде Lodash.

      function deepCopy(obj) {  
      return Array.isArray(obj)
          ? obj.map(deepCopy)
          : typeof obj === 'object'
          ? Object.keys(obj).reduce((acc, key) => {
              acc[key] = deepCopy(obj[key]);
              return acc;
            }, {})
          : obj;
      }

 

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

Уровень

  • Рейтинг:

    5

  • Сложность:

    6

Навыки

  • JavaScript

    JavaScript

Подпишись на React Developer в телеграм