Menu
Coddy logo textTech

Поверхностное и глубокое копирование

Часть раздела Логика и поток путешествия по JavaScript на Coddy — урок 25 из 65.

При копировании объектов существует два типа копирования:

  1. Поверхностное копирование — копирует только первый уровень
  2. Глубокое копирование — копирует все вложенные уровни

Методы поверхностного копирования:

Использование оператора spread:

const original = { a: 1, b: { x: 2 } };
const spreadCopy = { ...original };

Использование Object.assign(), который создает новый объект путем копирования свойств из исходного объекта в целевой:

const assignCopy = Object.assign({}, original);

Проблема с поверхностным копированием:

original.b.x = 3;
console.log(spreadCopy.b.x); // 3
// (вложенные объекты имеют общую ссылку)

console.log(assignCopy.b.x); // 3

Понимание методов JSON и глубокого копирования

JSON.stringify() преобразует объект JavaScript в строку JSON:

const obj = { name: "John", age: 30 };
const jsonString = JSON.stringify(obj);
console.log(jsonString); // "{"name":"John","age":30}"

JSON.parse() преобразует строку JSON обратно в объект JavaScript:

const backToObject = JSON.parse(jsonString);
console.log(backToObject); // { name: "John", age: 30 }

Глубокое копирование с использованием JSON:

const original = { a: 1, b: { x: 2 } };
const deepCopy = JSON.parse(JSON.stringify(original));

original.b.x = 3;
console.log(deepCopy.b.x); // 2 (полностью независимый)
challenge icon

Задание

Легко

Создайте функцию с именем processCart, которая принимает JSON строку, представляющую корзину покупок. Корзина содержит массив товаров с названиями и ценами. Ваша задача:

  1. Преобразовать JSON-строку в объект JavaScript
  2. Создать из нее ДВЕ отдельные корзины
  3. Во второй корзине:
    1. Добавить свойство discounted каждому товару, установив его в false
    2. Применить скидку 10% ко всем товарам, у которых price больше 50
    3. Установить 'discounted' в true для товаров, получивших скидку
  4. Вернуть массив, содержащий обе корзины

Шпаргалка

При копировании объектов существует два типа копирования:

  • Поверхностное копирование (Shallow Copy) — копирует только первый уровень
  • Глубокое копирование (Deep Copy) — копирует все вложенные уровни

Методы поверхностного копирования:

Использование оператора расширения (spread operator):

const original = { a: 1, b: { x: 2 } };
const spreadCopy = { ...original };

Использование Object.assign():

const assignCopy = Object.assign({}, original);

Проблема поверхностного копирования:

original.b.x = 3;
console.log(spreadCopy.b.x); // 3 (nested objects share reference)

Методы JSON:

JSON.stringify() преобразует объект JavaScript в строку JSON:

const obj = { name: "John", age: 30 };
const jsonString = JSON.stringify(obj);
console.log(jsonString); // "{"name":"John","age":30}"

JSON.parse() преобразует строку JSON обратно в объект JavaScript:

const backToObject = JSON.parse(jsonString);
console.log(backToObject); // { name: "John", age: 30 }

Глубокое копирование с использованием JSON:

const original = { a: 1, b: { x: 2 } };
const deepCopy = JSON.parse(JSON.stringify(original));

original.b.x = 3;
console.log(deepCopy.b.x); // 2 (completely independent)

Попробуйте сами

function processCart(jsonString) {
    // Напишите код здесь
}
// Не пишите ничего вне функции
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и поток