Конструкция switch ... case есть во многих, если не во всех, языках программирования. В JavaScript она заменяет собой условную конструкцию if ... else тогда, когда условие нужно проверить на совпадение с вполне конкретными значениями, а не со значениями внутри некоторого диапазона.
Работает условная конструкция switch...case так: оператор switch принимает какое-либо выражение или значение одной переменной, а затем просматривает ряд вариантов с помощью ключевых слов case, до тех пор, пока среди этих вариантов не найдется нужный. Далее выполняется код, соответствующий этому варианту. Если нужный вариант не найден, то выполнится код после ключевого слова default. Важный момент - после каждого блока кода после case необходимо записывать оператор break.
Синтаксис switch...case:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
switch (выражение или переменная) { case variant1: код 1; break; case variant2: код 2; break; // любое количество вариантов case variantN: код N; break; default: код, который выполняется, если нет совпадения ни с одним из вариантов; } |
На блок-схеме этот код выглядит так:
Давайте рассмотрим практический пример использования конструкции switch ... case. Например, мы просим пользователя ввести количество комнат в квартире и сохраняем это число в переменной rooms. В зависимости от того, вводит ли он 1, 2, 3 или 4, выдаем ему стоимость такой квартиры. В том случае, когда пользователь вводит любое другое число, срабатывает код после ключевого слова default, где мы выводим текст "Такое количество комнат в нашем проекте не предусмотрено". Для того чтобы не вызывать несколько диалоговых окон alert(), все строковые данные мы заносим в переменную str, и в самом конце кода, уже после того, как отработала конструкции switch ... case, выводим ее значение внутри alert().
|
1 2 3 4 5 6 7 8 9 |
let rooms = +prompt("Введите количество комнат в квартире"), str=""; switch(rooms){ case 1: str = "Стоимость $15 000"; break; case 2: str = "Стоимость $25 000"; break; case 3: str = "Стоимость $37 000"; break; case 4: str = "Стоимость $49 000"; break; default: str = "Такое количество комнат в нашем проекте не предусмотрено"; } alert(str); |
Попробовать:
Ниже вы найдете пример с использованием выражения внутри switch...case, которое подразумевает определение текущего дня недели на основе одного из методов объекта Date.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
let day="", today = new Date(); switch (today.getDay()) { case 0: day = "воскресенье"; break; case 1: day = "понедельник"; break; case 2: day = "вторник"; break; case 3: day = "среда"; break; case 4: day = "четверг"; break; case 5: day = "пятница"; break; case 6: day = "суббота"; } console.log(`Сегодня ${day}, ${today.toLocaleString()}`); |
Ниже вы увидите результат работы кода:
Один код для нескольких case
Интересной особенностью конструкции switch...case является то, что можно написать один код для нескольких ключевых слов case. Случаев таких немного, но рассмотреть их стоит. Будем использовать такой пример: пользователю нужно ввести номер месяца, в котором он родился: 1 - январь, 12 - декабрь, а мы сообщим пользователю, на какой сезон (зима, весна, лето или осень) приходится его месяц рождения.
Поскольку в каждом времени года по 3 месяца, мы используем их номера в case: ставим после значения двоеточие, но пишем код только для последнего, третьего месяца каждого из сезонов. Там же обязательно добавляем оператор break, который прерывает выполнение кода. В ключевом слове default указываем, что пользователь неверно ввел месяц, т.к. в диалоговом окне prompt() можно ввести, что угодно.
Обратите внимание на унарный плюс рядом с методом +prompt(), который преобразует строковое значение, возвращаемое из prompt(), в число . Если его не указать, скрипт работать не будет, т.к. вместо числа мы получим строку, а она не равна числу.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
let month = +prompt("Введите номер месяца, в котором вы родились: 1 - январь, 12 - декабрь"); switch(month){ case 12: case 1: case 2: alert("Вы родились зимой"); break; case 3: case 4: case 5: alert("Вы родились весной"); break; case 6: case 7: case 8: alert("Вы родились летом"); break; case 9: case 10: case 11: alert("Вы родились осенью"); break; default: alert("Нет такого месяца!"); } |
Попробуйте сами:
Выбор из нескольких вариантов в списке <select>
Давайте рассмотрим еще один пример, который позволит нам отследить выбор пользователя, но уже в мини-форме с выпадающим списком в виде элемента <select>, в котором мы также имеем ограниченный выбор из элементов <option>. В этом коде у нас несколько option с названиями сыров подразумевают, что они входят в пиццу "Четыре сыра", поэтому в default мы поместим именно ее название, чтобы не писать несколько лишних операторов case. Для реализации этого скрипта нам понадобится обработка события onchange.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<label for="cheese">Выберите вид сыра для пиццы: </label> <select id="cheese"> <option value="">Выберите вид сыра</option> <option value="mozarella">Моцарелла</option> <option value="filadelfia">Филадельфия</option> <option value="chedder">Чеддер</option> <option value="parmezan">Пармезан</option> <option value="mramor">Мраморный</option> <option value="dor-blue">Дор Блю</option> </select> <p id="output"></p> <script> let select = document.getElementById('cheese'), outputPar = document.getElementById('output') , result = ""; select.addEventListener('change', setPizza); function setPizza() { const choice = select.value; switch (choice) { case "": result = "не выбрана"; break; case "mozarella": result = "Маргарита"; break; case "filadelfia": result = "с курицей"; break; case "parmezan": result = "Парма"; break; default: result = "Четыре сыра"; } outputPar .textContent = `Пицца ${result}`; } </script> |
Попробуйте действие скрипта со switch...case для поля <select>:
Краткая альтернатива switch...case
Для конструкции switch...case есть альтернатива для выбора одного из нескольких известных вариантов. Это использование объекта со свойствами (ключами). Ниже мы рассмотрим 2 примера, в которых будем выполнять код и с помощью switch...case, и с помощью свойств объекта.
В первом примере будет происходить замена изображения в зависимости от выбора пользователя. Но в этот раз выбор будем рассматривать не только с позиции использования switch...case, но и с точки зрения объекта, в котором к определенным свойствам привязаны ссылки на изображения с фруктами.
В html-разметке у нас есть 2 изображения с id="fruitImg" и id="fruitImgObj". В зависимости от того, какой фрукт введет пользователь мы будем заменять в них изображения таким образом: в первом - с помощью switch...case, а во втором - с помощью объекта. Изображения добавляем с сервиса unsplash.com.
Код примера:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
<p><img src="https://source.unsplash.com/vb2qWEax4pM/300x300" alt="Choose fruit" title="Choose fruit" id="fruitImg"> <img src="https://source.unsplash.com/POMpXtcVYHo/300x300" alt="Choose fruit" title="Choose fruit" id="fruitImgObj"> </p> <p>Выбор из: </p> <ul> <li>- apple</li> <li>- banana</li> <li>- grape</li> <li>- kiwi</li> <li>- peach</li> <li>- pinapple</li> <li>- melon</li> <li>- watermelon</li> </ul> <p><input type="button" onclick="chooseFruitImg()" value="Выбрать фрукт (на англ.)"></p> <script> function chooseFruitImg(){ let fruitChioce = prompt("Enter fruit", "pinapple"), imgURL = ""; let fruits = { apple: "https://source.unsplash.com/iqIJE3Jo8YM/300x300", banana: "https://source.unsplash.com/fczCr7MdE7U/300x300", grape: "https://source.unsplash.com/vGQ49l9I4EE/300x300", kiwi: "https://source.unsplash.com/a9rxefN9vgY/300x300", peach: "https://source.unsplash.com/l60tPwIN0uo/300x300", pinapple: "https://source.unsplash.com/Lkf6FmPu25U/300x300", melon: "https://source.unsplash.com/AbwqpFnBDms/300x300", watermelon: "https://source.unsplash.com/1C55VIfJSuQ/300x300", } switch(fruitChioce){ case "apple": imgURL = "https://source.unsplash.com/I58f47LRQYM/300x300"; break; case "banana": imgURL = "https://source.unsplash.com/aEwNCA_uiVg/300x300"; break; case "grape": imgURL = "https://source.unsplash.com/UqgTtfaikio/300x300"; break; case "kiwi": imgURL = "https://source.unsplash.com/1oMGgHn-M8k/300x300"; break; case "peach": imgURL = "https://source.unsplash.com/Ze0QgKf2u0k/300x300"; break; case "pinapple": imgURL = "https://source.unsplash.com/-E3dv3zRGEk/300x300"; break; case "melon": imgURL = "https://source.unsplash.com/MQ82YY6iuPc/300x300"; break; case "watermellon": case "watermelon": imgURL = "https://source.unsplash.com/izi5AnlbRIA/300x300"; break; default: imgURL = "https://source.unsplash.com/zeFy-oCUhV8/300x300"; } fruitImg.src = imgURL; fruitImgObj.src = fruits[fruitChioce] || 'https://source.unsplash.com/M_xIaxQE3Ms/300x300'; fruitImg.alt = fruitImg.title = fruitImgObj.alt = fruitImgObj.title = fruitChioce; } </script> |
Давайте протестируем пример. Обратите внимание, что в 2-х тегах <img> происходит загрузка разных изображений, хотя и с одними и теми же фруктами. Разница в способах будет заметна еще и тогда, когда пользователь введет фрукт не из списка: во втором варианте вместо оператора default используется логическое ИЛИ (||).
Выбор из:
- - apple
- - banana
- - grape
- - kiwi
- - peach
- - pinapple
- - melon
- - watermelon
Во втором примере мы можем использовать switch...case и объект с именами функций, связанными с его свойствами-ключами, как альтернативу выражению с оператором switch:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
<p id="colorBlock" style="width: 300px; height: 300px; display: inline-block;" class="test"></p> <p id="colorBlock2" style="width: 300px; height: 300px; display: inline-block;" class="test"></p> <script> const n = +prompt("Введите число от 1 до 3", 3); // набор функций для switch...case function gradient1(){ colorBlock.style.backgroundImage = "linear-gradient(to right, #f00, #ff0)"; } function gradient2(){ colorBlock.style.backgroundImage = "linear-gradient(to left, #cc1cd3, #5e09c3)"; } function gradient3(){ colorBlock.style.backgroundImage = "repeating-linear-gradient(#333 15px, #34f8f1 30px)"; } function radialGradient(){ colorBlock.style.backgroundImage = "radial-gradient(#f7e834, #089a24)"; } // набор функций для использования объекта function gradient4(){ colorBlock2.style.backgroundImage = "linear-gradient(to left, #f86c6c, #710900)"; } function gradient5(){ colorBlock2.style.backgroundImage = "linear-gradient(to left, #1cd386, #017939)"; } function gradient6(){ colorBlock2.style.backgroundImage = "repeating-linear-gradient(45deg, #a20000 25px, #f9bafc 50px)"; } function radialGradient2(){ colorBlock2.style.backgroundImage = "radial-gradient(#6abaff, #004d8e)"; } // Длинный способ switch (n) { case 1: gradient1(); break; case 2: gradient2(); break; case 3: gradient3(); break; default: radialGradient(); } // Короткий способ var colorCases = { 1: gradient4, 2: gradient5, 3: gradient6 }; radialGradient2() || colorCases[n](); </script> |
Обратите внимание на круглые скобки вызова функции в объекте colorCases и вызов функции radialGradient2() в том случае, если пользователь введет цифру больше или меньше нужной или любые нецифровые символы.
Давайте протестируем пример.
Надеюсь, способы использования условной конструкции switch ... case теперь понятны для вас.