# SWITCH

Множественные ветвления с использованием `else...if` считается плохой практикой и сейчас встречаются скорее в легаси-коде и не уместны для использования в текущей практике.

Как альтернативу применяют оператор `switch`, который принимает в качестве параметра входящее значение и в отдельных `case` проверяет соответствие. Если какой-то из кейсов совпал, значит код, указанный в нем должен выполниться. Чтобы не допустить исполнение следующего кейса по цепочке, необходимо указывать директиву `break` в конце каждого кейса.  Для кода не учтенный значений в кейсах используется `default`, он всегда один и в конце конструкции `switch`, после всех `case`. Ему `break` не нужен, потому что и так последний и после него ничего быть не должно.

Рассмотрим пример использования множественного ветвления `else...if`:

![](https://2836573515-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9Rcoi1TYAuMIrGFyZ1PS%2Fuploads%2FP98Grzy1X6G9G5Btu2QX%2Felse_if.png?alt=media\&token=f2821562-d754-4085-9936-fc44e45354fd)

А теперь, как то же самое может быть написано с помощью `switch`:

![](https://2836573515-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9Rcoi1TYAuMIrGFyZ1PS%2Fuploads%2FS7TMkBAiaRANQr0aHoeV%2Fswitch.png?alt=media\&token=bec913cf-bbe9-4923-881f-59003fe331d4)

Это очень примитивный пример, отражающий скорее синтаксис и суть альтернативы, что за что отвечает в этих 2х принципах ветвления.

Хоть switch и лучший способ, но не самый оптимальный для такой простой проверки.

Для тех кто уже знаком с функциями, объектами  и свойствами объектов, думаю станет понятен следующий код:

![](https://2836573515-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9Rcoi1TYAuMIrGFyZ1PS%2Fuploads%2Fnu0SdF6pf2OBqIez5OCp%2F1_00XQ6oil_UBNDfATJ6OeWg.png?alt=media\&token=d9a3289e-8f24-4bd6-8040-5e5e15be1858)

С точки зрения исполнения кода, гораздо легче хранить все условия, как свойства объекта, где ключем является значение проверяемого `case`, а значением, то, что этот case должен вернуть в результате совпадения.

Функция `getIngredient` в свою очередь вернет значение из объекта `ingredients` по полученному при вызове аргументу, что подставится как имя ключа.

Этим значением будет `undefined`, если в объекте ingredients не существует такого имени ключа, как получили через аргумент, а так как оператор `||` вернет правый `truthy` операнд, если левый `falsy`, то в таком случае результатом вызова функции станет `'lemon'`, в противном случае, если значение аргумента и имя ключа в объекте совпадут, то функция вернет значения свойства объекта с таким именем.

Это отличный рефакторинг, облегчающий чтение и поддержку кода в проекте.

Также можно улучшить выше описанный способ с использованием Map:

![](https://2836573515-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9Rcoi1TYAuMIrGFyZ1PS%2Fuploads%2FwkGijr2dgRvU4nlt3Pby%2Fmap.png?alt=media\&token=e35446dc-fabe-4244-80bb-b8be746d77c2)

&#x20;Удобство использования коллекции `Map` вместо обычного объекта заключается в возможности установления имени ключа не только типа данных `string`, но другие примитивы. Например, ключем может быть любое число (0, 1, ..., 100500), булевый `true` или `false`.
