Оператор 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 , будет ошибка. Так что это своего рода самострахование.