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.