Вчера я писал об использовании оператора распространения (…) в массивах javascript. Сегодня давайте кратко поговорим об объектах.

На самом деле он очень похож, но замечательно работает с объединяемыми объектами. Вот что я имею в виду. Объединение объектов работает аналогично массивам:

> const metasyntactic1 = {
     foo: "bar",
     baz: "qux",
  }
>  const metasyntactic2 = {
     quux: "quuz",
     corge: "grault",
  }
> {...metasyntactic1, ...metasyntactic2}
{
   foo: "bar",
   baz: "qux",
   quux: "quuz",
   corge: "grault"
}

Но что происходит, когда возникает конфликт имен?

> const metasyntactic1 = {
     foo: "bar",
     baz: "qux",
  }
>  const metasyntactic2 = {
     baz: "quuz",
     corge: "grault",
  }
> {...metasyntactic1, ...metasyntactic2}
{
   foo: "bar",
   baz: "quuz",
   corge: "grault"
}

Итак, последние объекты перезаписывают более ранние. Прохладный.

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

> const beercan = {
     foo: "bar",
     baz: "quuz",
     corge: "grault",
  }
> {...beercan, foo: "bud"}
{
  foo: "bud",
  baz: "quuz",  
  corge: "grault",
}

Это создает копию пивной банки (сама пивная банка не изменяется), но с заменой переменной «foo».

Как и в случае с массивами, вы можете иметь столько элементов в этих конструкторах, сколько захотите.

{...foo, ...bar, bob: "onion", joe: "orange", ...baz}