В ES6 есть реструктуризация объектов для создания переменных из свойств объекта.
Мы можем создавать объекты с {...}
и свойствами, которые имеют пару ключ-значение. Ключ имеет ''
вокруг него, а :
между ключом и значением. Значение может быть любого типа.
const name = { 'firstName': 'John', 'lastName': 'Smith' }
Мы используем нотацию .
для получения значений свойств.
let firstName = name.firstName;
Деструктуризация объекта
Мы можем использовать деструктуризацию объекта Javascript для извлечения значений из свойства объекта или массива и присвоения их переменной. Имя ключа объекта — это переменная, которая содержит значение.
const { firstName } = name;
В приведенном выше примере мы извлекаем свойство объекта firstName
и помещаем внутрь {}
. Это имя переменной, которая содержит значение свойства. Мы можем использовать let или const для типа переменных.
Мы можем извлечь несколько значений из свойств объекта.
const {firstName, lastName} = name;
Добавить новую переменную и значение по умолчанию
const { firstName, lastName, age=34 } = user;
Мы добавляем age=34
при деструктуризации. Мы можем объединить свойства firstName
lastName
в новое свойство fullName
const { fisrtName, lastName, fullName=`${firstName} ${lastName}` } = user;
Добавить псевдонимы
const { fristName: fName } = name; console.log(fName) // John
Деструктуризация вложенных объектов
const name = { 'firstName': 'John', 'lastName': 'Smith', 'address':{ 'street': '43 S. Fox st', 'city': 'Denver', 'zip': 80232 } const { address: { street } } = name
Вы должны начать с верхнего уровня и спускаться вниз по иерархии, пока не достигнете значения, которое хотите извлечь.
Распространение синтаксиса в JavaScript
Синтаксис спреда (также известный как оператор спреда) — еще одна замечательная функция ES6. Как видно из названия, он принимает итерируемый объект (например, массив) и расширяет (распространяет) его на отдельные элементы.
Мы также можем расширять объекты, используя синтаксис распространения, и копировать его свойства enumerable
в новый объект.
Расширенный синтаксис помогает нам клонировать объект с самым простым синтаксисом, используя фигурные скобки и три точки {...}
.
const clone_some_object = {...some_object}
Благодаря синтаксису распространения мы можем клонировать, обновлять и объединять объекты immutable
способом. Неизменяемость помогает уменьшить любые случайные или непреднамеренные изменения исходного (исходного) объекта.
Синтаксис деструктуризации объекта и распространения — это не одно и то же в JavaScript.
Создать клон объекта
Мы можем создать клонированный экземпляр объекта, используя синтаксис распространения следующим образом:
const user = { 'name': 'Alex', 'address': '15th Park Avenue', 'age': 43 }
const clone = {...user} // Output, {name: "Alex", address: "15th Park Avenue", age: 43}
clone === user; // Output, false
В качестве альтернативы вы можете использовать object.assign()
для создания клона объекта. Однако синтаксис расширения намного точнее и намного короче.
Синтаксис расширения выполняет поверхностную копию объекта. Это означает, что ни один из экземпляров вложенных объектов не клонирован.
Обновление вложенных объектов
Как мы видели, обновить объект с помощью синтаксиса распространения легко, и это не изменяет исходный объект. Однако это может быть немного сложно, когда вы пытаетесь обновить вложенный объект, используя синтаксис расширения. Давайте разберемся на примере.
У нас есть объект user
со свойством department
. Значением свойства department
является объект, у которого есть другой вложенный объект с его свойством address
.
const user = {
'name': 'Alex',
'address': '15th Park Avenue',
'age': 43,
'department':{
'name': 'Sales',
'Shift': 'Morning',
'address': {
'city': 'Bangalore',
'street': '7th Residency Rd',
'zip': 560001
}
}
}
Теперь, как мы можем добавить новое свойство с именем number
со значением, скажем, 7
для объекта department
? Что ж, мы могли бы попробовать следующий код, чтобы добиться этого (но это было бы ошибкой):
const updated = { ...user, department: {'number': 7} }
console.log(updated);
Выполнив его, вы поймете, что код заменит весь объект отдела новым значением {'number': 7}
. Это не то, что мы хотели!
Как это исправить? Нам нужно распространить свойства вложенного объекта, а также добавить/обновить его. Вот правильный синтаксис, который добавит новое свойство number
со значением 7
в объект department
без замены его значения:
const updated = { ...user, department: { ...user.department, 'number': 7 } };
console.log(updated);
Параметр Rest в JavaScript
Параметр Rest
немного противоположен синтаксису spread
. В то время как синтаксис расширения помогает расширять или распространять элементы и свойства, параметр rest помогает собирать их вместе.
В случае объектов параметр rest в основном используется с синтаксисом деструктурирования для объединения оставшихся свойств в новом объекте, с которым вы работаете.
Давайте посмотрим на пример следующего объекта user
:
const user = {
'name': 'Alex',
'address': '15th Park Avenue',
'age': 43
}
Мы знаем, как деструктурировать свойство age
, чтобы создать переменную и присвоить ей значение. Как насчет создания другого объекта одновременно с остальными свойствами объекта user
? Ну вот:
const {age, ...rest} = user;
console.log(age, rest);
Вывод будет:
В выводе мы видим, что значение age
равно 43
. rest parameter
объединяет остальные свойства объекта user
, name
и address
, в отдельный объект.
Ссылки:
https://www.freecodecamp.org/news/javascript-object-destructuring-spread-operator-rest-parameter/