Неглубокая копия

Неглубокая копия содержит тот же элемент, что и исходный элемент.
Если исходный элемент содержит ссылки на другой элемент, будь то объект / массив / карта, то ссылки получают копии в клонированном элементе.

Итак, если мы изменим значение либо в исходном элементе, либо в клонированном элементе, изменение отразится на обоих из них.

Давайте разберемся в этом лучше, посмотрев на пример:

let employeeDetail = {name: ‘teddy’, age: 25, designation: ‘software developer’}

Итак, допустим, теперь вам нужно скопировать эту информацию в другой объект, и вы делаете:
let employeeDetailDuplicate = employeeDetail // shallow copy

Значение указателя, указывающего на объект employeeDetail, копируется в employeeDetailDuplicate, что означает, что они оба указывают на одно и то же место.

Теперь, если вы скажете,

employeeDetailDuplicate.name = ‘ash’

значение поля имени изменится как в employeeDetail, так и в employeeDetailDuplicate.

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

let products: Map<string, number>;

Допустим, у вас есть три продукта:
1. имя: фасоли, количество: 3
2. имя: холодильник, количество: 2
3. имя: ac, количество: 4

Хранение их на карте обычно выглядит так:

products.set(‘bean bags’, 3);
products.set(‘fridge’, 2);
products.set(‘ac’, 4);

Теперь те же принципы будут применяться, если мы сделаем неглубокую копию, как это:
let productsDuplicate: Map<string, number> = products
Любое изменение в productsDuplicate также отразится на карте продуктов.

Глубокая копия

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

Таким образом, глубокая копия требует дополнительного пространства столько же, сколько и исходный элемент.
Это помогает нам отслеживать исходный элемент, если мы хотим изменить его свойства.

Сравнивая это на приведенных выше примерах:

// Deep copy
let employeeDetail = {name: ‘teddy’, age: 25, designation: ‘software developer’}
let employeeDetailDuplicate = {};
employeeDetailDuplicate.name = employeeDetail.name;
employeeDetailDuplicate.age = employeeDetail.age;
employeeDetailDuplicate.designation = employeeDetail.designation;
// Deep copy
let products: Map<string, number>;
products.set(‘bean bags’, 3);
products.set(‘fridge’, 2);
products.set(‘ac’, 4);
let productDuplicate: Map<string, number>;
products.forEach((value, key) => {
 productsDuplicate.set(key, value);
})

счастливого кодирования :)