Пусть у нас есть вот такой код:
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;
}
Итак, давайте перепишем приведенный выше
код через 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
в данном случае считается более выразительным.
При этом в блоке case
нужно писать
какое-то конкретное значение - там нельзя
использовать логические операции (==, больше,
меньше и тп). То есть 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
, а затем неожиданно
еще и case3
:
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);