Skip to content

Commit f4f01fb

Browse files
authored
Merge pull request #1003 from InFuz/patch-1
Дополнена и расширена информация о работе метода Object.assign
2 parents a5ba8e9 + d563ee1 commit f4f01fb

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

1-js/04-object-basics/01-object/article.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,10 @@ alert(clone.sizes.width); // 51, видим результат в другом
744744

745745
Чтобы исправить это, мы должны в цикле клонирования делать проверку, не является ли значение `user[key]` объектом, и если это так - копируем и его структуру тоже. Это называется "глубокое клонирование".
746746

747+
````warn header="Object.assign не делает глубокое клонирования объекта!"
748+
Пример выше наглядно демонстрирует, что Object.assign не создает полную копию объекта, а лишь копирует свойства из исходных объектов в целевой объект `Object.assign(target, obj1, obj2, ...)`. При этом копирование происходит точно так же как и при обычном присваивании `target.a = source.a`. Т.е. если свойство `a` будет примитивным типом данных (number, string и т.д.) оно будет копировано «по значению», если же свойство `a` не является примитивом, в качестве значения свойства в `target.a` будет передана ссылка на свойство `source.a`.
749+
````
750+
747751
Существует стандартный алгоритм глубокого клонирования, [Structured cloning algorithm](http://w3c.github.io/html/infrastructure.html#safe-passing-of-structured-data). Он решает описанную выше задачу, а также более сложные задачи.
748752
Чтобы не изобретать велосипед, мы можем использовать реализацию этого алгоритма из JavaScript-библиотеки [lodash](https://lodash.com), метод [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep).
749753

@@ -768,7 +772,7 @@ alert(clone.sizes.width); // 51, видим результат в другом
768772

769773
Объекты присваиваются и копируются по ссылке. Другими словами, переменная хранит не "значение объекта", а "ссылку" (адрес в памяти) на это значение. Поэтому копирование такой переменной или передача её в качестве аргумента функции приводит к копированию этой ссылки, а не самого объекта. Все операции с использованием скопированных ссылок (например, добавление или удаление свойств) выполняются с одним и тем же объектом.
770774

771-
Чтобы сделать "настоящую копию" (клон), мы можем использовать `Object.assign` или [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep).
775+
Для "простого клонирования" объекта можно использовать `Object.assign`. Необходимо помнить, что `Object.assign` не делает глубокое клонирования объекта. Если внутри копируемого объекта есть свойство значение, которого не является примитивом, оно будет передано по ссылке. Для создания "настоящей копии" (полного клона объекта) можно воспользоваться методом из сторонней JavaScript-библиотеки [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep).
772776

773777
То, что мы изучали в этой главе, называется "простым объектом" ("plain object") или просто `Object`.
774778

0 commit comments

Comments
 (0)