Конструкция 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
теперь понятны для вас.