TL;DR
In Object.assign()
,
- позиция параметра имеет значение
Целевой объект определяется его позицией в параметрах. Все, что находится на первом месте в параметрах метода, становится целевым объектом.
- порядок параметров имеет значение
Свойства перезаписываются другими объектами, которые имеют те же свойства позже в порядке параметров.
- Предупреждение о глубоком клонировании
Если исходное значение является ссылкой на объект, оно копируеттолько значение ссылки. Object.assign()
копирует значения свойств и выполняет только поверхностное клонирование, а не глубокое клонирование.
0_ [Основная операция] копирование свойств
Основным вариантом использования Object.assign()
является копирование всех свойств из исходного объекта в целевой объект.
// HERE sourceObj is assigned to targetObj ( {} )
1_ изменчивость целевого объекта
Object.assign()
имеет следующий синтаксис
Object.assign(target, ...sources)
Есть целевой объект и исходный объект (ы). целевой объект определяется его положением в параметрах. Все, что находится первым в параметрах метода, становится целевым объектом.
Например, в приведенном выше коде targetObj
становится целевым объектом, поскольку он позиционируется первым в методе Object.assign()
.
const copy = Object.assign(targetObj, sourceObj)
и не только переменная copy
, но и переменная targetObj
видоизменены / заново назначены исходными объектами sourceObj
2_ объединение объектов с одинаковыми свойствами
Свойства перезаписываются другими объектами с такими же свойствами позже в порядке параметров.
3_ Предупреждение о глубоком клонировании
Вместо Object.assign()
нам нужно использовать альтернативу для глубокого клонирования. Например, мы можем использовать JSON.stringify
Всякий раз, когда новое значение присваивается originalObj
, свойство assignObj
также изменяется, потому что assignObj
просто ссылается на originalObj
** неглубокий клон.
Принимая во внимание, что JSON.parse(JSON.stringify(obj))
выполняет глубокое клонирование, поэтому свойства deepObj1
, deepObj2
и DeepObj3
вообще не изменяются в ответ на изменение originalObj
.