Конструкция switch-case в JavaScript

Пусть у нас есть вот такой код:

let lang = 'ru'; if (lang == 'ru') { alert('рус'); } else if (lang == 'en') { alert('анг'); } else if (lang == 'de') { alert('нем'); } else { alert('язык не поддерживается'); }

Давайте перепишем этот код через конструкцию switch-case, представляющую собой альтернативу if-else.

Для начала изучите ее синтаксис:

switch (переменная) { case 'значение1': /* здесь код, который выполнится в случае, если переменная имеет значение1 */ break; case 'значение2': /* здесь код, который выполнится в случае, если переменная имеет значение2 */ break; case 'значение3': /* здесь код, который выполнится в случае, если переменная имеет значение3 */ break; default: /* здесь код, который выполнится в случае, если не совпала ни с одним значением */ break; }

Обратите внимание на то, что в блоке case нужно писать какое-то конкретное значение - там нельзя использовать логические операции (==, больше, меньше и тп).

То есть switch-case используется для выбора одного значения из некоторого ряда значений. Если вам нужно нечто более сложное - необходимо использовать ифы.


Итак, давайте перепишем приведенный выше код через switch-case:

let lang = 'ru'; switch (lang) { case 'ru': alert('рус'); break; case 'en': alert('англ'); break; case 'de': alert('нем'); break; default: alert('язык не поддерживается'); break; }

В общем-то в данной задаче нет разницы, какой вариант решения выбрать: через switch-case или через if. Решение через switch-case в данном случае считается более выразительным.

Переменная num может принимать значения 1, 2, 3 или 4. Если она имеет значение 1, то выведите на экран текст 'зима', если значение 2 - 'весна' и так далее. Если в переменной будет какое-то другое значение - выведите на экран сообщение об ошибке. Решите задачу через switch-case.

Необязательность break

Команда break является необязательной. Без нее, однако, поведение блоков case будет неожиданным.

Давайте посмотрим на примере. Пусть у нас есть вот такой код:

let num = 1; switch (num) { case 1: alert(1); break; case 2: alert(2); break; case 3: alert(3); break; }

Уберем в нем все break, а в переменную num для начала запишем число 3.

Пока все будет работать так, как и работало:

let num = 3; // пусть здесь число 3 switch (num) { case 1: alert(1); case 2: alert(2); case 3: alert(3); } // После запуска код выведет 3 - все хорошо

Давайте теперь в переменную num запишем число 2. В этом случае у нас ожидаемо выполнится case 2, а затем неожиданно еще и case 3:

let num = 2; switch (num) { case 1: alert(1); case 2: alert(2); case 3: alert(3); } // После запуска код выведет 2, а затем 3

Если же в переменную num записать число 1 - то вообще выполнятся все конструкции case:

let num = 1; switch (num) { case 1: alert(1); case 2: alert(2); case 3: alert(3); } // После запуска код выведет 1, затем 2, а затем 3

То есть получается, что при отсутствии break после выполнения задуманного case, выполнятся и все case ниже него.

Иногда такую особенность используют, при решении задач.

В следующем примере, если переменная num имеет значение 1 или 2, то в переменную result запишется 'a'.

Если же переменная num имеет значение 3, то в переменную result запишется 'b':

let num = 1; let result; switch (num) { case 1: case 2: result = 'a'; break; case 3: result = 'b'; break; } alert(result);

Выше я написал, что иногда такую особенность используют, но я, в общем-то, не рекомендую ей пользоваться, так как код становится не очень очевидным.

Очевиднее решить такую задачу через ифы:

let num = 1; let result; if (num == 1 || num == 2) { result = 'a'; } if (num == 3) { result = 'b'; } alert(result);