› 1: Псевдоним

Свойство может быть распаковано из объекта и присвоено переменной с именем, отличным от имени свойства объекта.

// {sourceProperty: targetVariable (Alias) }p --> foo
q --> bar

› 2: значение по умолчанию

Переменной может быть присвоено значение по умолчанию, в случае, если из объекта распаковано значение undefined (не предусмотрено)

const {a = 10, b = 5} = {a: 3, b: undefined (Not provided) }
Therefore,
a (3 | 10) --> 3
b (undefined | 5) --> 5

› 3: Объединение 1 и 2 ; Псевдоним и значение по умолчанию

const {a: aa = 10, b: bb = 5} = {a: 3, b: undefined}
Therefore,
- Step1 
a (3 | 10) --> 3
b (undefined | 5) --> 5
- Step2
// {sourceProperty: targetVariable (Alias) }
a --> aa
b --> bb

› 4: Основное задание

const {p, q} = {p: 42, q: true}
p --> 42
q --> true

› 4.1: Необычность: будьте осторожны с использованием `let`

Код ниже не будет работать

  • JavaScript обрабатывает {...} в основном потоке кода (а не внутри другого выражения) как блок кода (напоминание: let имеет область действия блока)

›› Исправление 1

›› Исправление 2

› 5: Деструктуризация функциональных параметров

userId(user) // passing user Object
function userId({id}) === {id: 42, displayName: 'jdoe', fullName: {...}
Therefore,
id inside userId function becomes 42
  • user объект id свойство деструктурировано, поэтому становится{id: id}

› 5.1: Сингулярность: будьте осторожны с параметрами по умолчанию

›› Исправление 1

предоставление {}, которое используется в качестве значения по умолчанию для объекта параметра

›› Исправление 2

делая {} значением по умолчанию для всего объекта параметров

› 6: Деструктуризация параметра функции вложенного объекта

  • displayName деструктурирован так же, как ›5:
  • firstName вложенное свойство пользовательского объекта деструктурировано дважды
// destructuring fullName (1st depth)
const user = { fullName : { ... } } // {fullName}
// destructuring firstName (2nd depth)
{fullName: {firstName}} // {firstName}
// firstName alias to name
{fullName: {firstName: name}} // name

› 7: распространение в деструктурировании объектов

Свойства Rest/spread собирают оставшиеся собственные перечисляемые ключи свойств, которые еще не выбраны шаблоном деструктурирования.

let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40}
a --> 10
b --> 20
rest --> {c: 30, d: 40} // what's left