JavaScript, как и большинство языков программирования, имеет механизмы для создания повторяющихся значений или копирования информации. В этой статье мы рассмотрим два основных способа создания копий JavaScript: глубокое и поверхностное копирование.
Копирование переменной с примитивным типом данных, таким как строка или число, довольно прямолинейно, но может стать немного сложным, когда дело доходит до копирования итерируемых объектов.
Что такое итерируемый объект?
Итерируемый объект — это просто что-нибудь в JavaScript, через которое можно выполнить цикл — и объекты, и массивы являются итерируемыми.
Технически массив в javascript имеет тип данных объекта, но мы не будем вдаваться в подробности в этой статье.
Вот пример объекта JavaScript, с которым мы будем работать:
const person = { name: "Jacob Khan", age: 23, address: { street: "123 Main Street", city: "New York", state: "NY", } };
Поверхностное копирование
Если бы мы хотели использовать оператор распространения (...
) для копирования нашего объекта person
. Синтаксис может выглядеть так:👆
const copiedPerson = { ...person };
Довольно легко, правда? Теперь давайте немного отредактируем. Изменение свойства age
нашего скопированного объекта не повлияет на исходные данные person
:
copiedPerson.age = 33;
Хороший! Но что, если мы изменим state
внутри свойства address
?
copiedPerson.address.state = "CA";
Ой! Если вы проверите исходный объект person
, вы обнаружите, что state
также обновился в исходном объекте.
Это связано с тем, что оператор распространения создает мелкую копию объекта, углубляясь только на один уровень. Для вложенных свойств или элементов он просто копирует ссылку, а не фактические вложенные объекты.
Решение: глубокое копирование
Глубокое копирование, как следует из названия, копирует объект более тщательно. Он копирует не только свойства верхнего уровня, но и дублирует все нижние, вложенные…