Оператор switch
может заменить несколько проверок if
.
Это дает более наглядный способ сравнения значения с несколькими вариантами.
switch
имеет один или несколько блоков case
и необязательный параметр по умолчанию.
Это выглядит так:
переключатель (х) { case 'value1': // if (x === 'value1') ... [перерыв] case 'value2': // if (x === 'value2') ... [перерыв] по умолчанию: ... [перерыв] }
Значение x
проверяется на строгое равенство значению из первого case
(то есть value1
), затем второму ( value2
) и так далее.
Если равенство найдено, switch
начинает выполнять код, начиная с соответствующего case
, до ближайшего break
(или до конца switch
).
Если ни один регистр не найден, выполняется код default
(если он существует).
Пример switch
(исполняемый код выделен):
пусть а = 2 + 2; переключатель (а) { случай 3: alert('Слишком маленький'); перерыв; случай 4: alert('Именно!'); перерыв; случай 5: alert('Слишком большой'); перерыв; по умолчанию: alert("Я не знаю таких значений"); }
Здесь switch
начинает сравнивать a
из первого варианта case
, то есть 3
. Матч провален.
Затем 4
. Это совпадение, поэтому выполнение начинается с case 4
до ближайшего break
.
Если break
нет, выполнение продолжается со следующего case
без каких-либо проверок.
Пример без break
:
пусть а = 2 + 2; переключатель (а) { случай 3: alert('Слишком маленький'); случай 4: alert('Именно!'); случай 5: alert('Слишком большой'); по умолчанию: alert("Я не знаю таких значений"); }
В приведенном выше примере мы увидим последовательное выполнение трех alert
:
alert('Именно!'); alert('Слишком большой'); alert("Я не знаю таких значений");
Любое выражение может быть аргументом switch/case
И switch
, и case
допускают произвольные выражения.
Например:
пусть а = "1"; пусть б = 0; переключатель (+а) { случай б + 1: alert("Это выполняется, поскольку +a равно 1, что в точности равно b+1"); перерыв; по умолчанию: alert("это не запускается"); }
Здесь +a
дает 1
, это сравнивается с b + 1
в case
, и соответствующий код выполняется.
Можно сгруппировать несколько вариантов case
с одним и тем же кодом.
Например, если мы хотим, чтобы один и тот же код выполнялся для case 3
и case 5
:
пусть а = 3; переключатель (а) { случай 4: alert('Верно!'); перерыв; случай 3: // (*) сгруппировали два случая случай 5: alert('Неправильно!'); alert("Почему бы тебе не пойти на урок математики?"); перерыв; по умолчанию: alert('Результат странный. Действительно.'); }
Теперь и 3
, и 5
показывают одно и то же сообщение.
Возможность «группировать» случаи — это побочный эффект того, как switch/case
работает без break
. Здесь выполнение case 3
начинается со строки (*)
и продолжается до case 5
, поскольку break
нет.
Подчеркнем, что проверка на равенство всегда строгая. Для соответствия значения должны быть одного и того же типа.
Например, рассмотрим код:
let arg = Prompt("Введите значение?"); переключатель (аргумент) { случай '0': случай '1': alert('Один или ноль'); перерыв; случай '2': Предупреждение('Два'); перерыв; случай 3: alert('Никогда не выполняется!'); перерыв; по умолчанию: alert('Неизвестное значение'); }
Для 0
, 1
запускается первое alert
.
Для 2
запускается второе alert
.
Но для 3
результатом prompt
является строка "3"
, которая не совсем равна ===
числу 3
. Итак, в case 3
у нас есть мертвый код! Вариант default
будет выполнен.
важность: 5
Напишите код, используя if..else
, который будет соответствовать следующему switch
:
переключатель (браузер) { корпус «Край»: alert("У вас есть преимущество!"); перерыв; корпус «Хром»: чехол «Firefox»: чехол «Сафари»: чехол «Опера»: alert('Хорошо, мы тоже поддерживаем эти браузеры'); перерыв; по умолчанию: alert('Мы надеемся, что эта страница выглядит нормально!'); }
Чтобы точно соответствовать функциональности switch
, оператор if
должен использовать строгое сравнение '==='
.
Однако для заданных строк работает и простой оператор '=='
.
if(браузер == 'Край') { alert("У вас есть преимущество!"); } else if (браузер == 'Chrome' || браузер == 'Firefox' || браузер == 'Сафари' || браузер == 'Опера') { alert('Хорошо, мы тоже поддерживаем эти браузеры'); } еще { alert('Мы надеемся, что эта страница выглядит нормально!'); }
Обратите внимание: конструкция browser == 'Chrome' || browser == 'Firefox' …
разбит на несколько строк для лучшей читаемости.
Но конструкция switch
по-прежнему более понятна и наглядна.
важность: 4
Перепишите приведенный ниже код, используя один оператор switch
:
let a = +prompt('a?', ''); если (а == 0) { предупреждение(0); } если (а == 1) { предупреждение( 1 ); } если (а == 2 || а == 3) { предупреждение('2,3'); }
Первые две проверки превращаются в два case
. Третья проверка разделена на два случая:
let a = +prompt('a?', ''); переключатель (а) { случай 0: предупреждение(0); перерыв; случай 1: предупреждение( 1 ); перерыв; случай 2: случай 3: предупреждение('2,3'); перерыв; }
Обратите внимание: break
внизу не требуется. Но мы ввели это, чтобы сделать код перспективным.
В будущем есть вероятность, что мы захотим добавить еще один case
, например case 4
. И если мы забудем добавить перед ним разрыв, в конце case 3
, будет ошибка. Так что это своего рода самострахование.