Книга: JavaScript. Подробное руководство, 6-е издание
5.4.3. Инструкция switch
5.4.3. Инструкция switch
Инструкция if
создает ветвление в потоке выполнения программы, а многопозиционное ветвление можно реализовать посредством нескольких инструкций else if
. Однако это не всегда наилучшее решение, особенно если все ветви зависят от значения одного и того же выражения. В этом случае расточительно повторно вычислять значение одного и того же выражения в нескольких инструкциях if
.
Инструкция switch
предназначена именно для таких ситуаций. За ключевым словом switch
следует выражение в скобках и блок кода в фигурных скобках:
switch(выражение) {
инструкции
}
Однако полный синтаксис инструкции switch
более сложен, чем показано здесь. Различные места в блоке помечены ключевым словом case
, за которым следует выражение и символ двоеточия. Ключевое слово case
напоминает инструкцию с меткой за исключением того, что оно связывает инструкцию с выражением, а не с именем. Когда выполняется инструкция switch
, она вычисляет значение выражения, а затем ищет метку case
, соответствующую этому значению (соответствие определяется с помощью оператора идентичности ===
). Если метка найдена, выполняется блок кода, начиная с первой инструкции, следующей за меткой case
. Если метка case
с соответствующим значением не найдена, выполнение начинается с первой инструкции, следующей за специальной меткой default:
. Если метка default:
отсутствует, блок инструкции switch
пропускается целиком.
Работу инструкции switch
сложно объяснить на словах, гораздо понятнее выглядит объяснение на примере. Следующая инструкцияswitch
эквивалентна повторяющимся инструкциям if/else
, показанным в предыдущем разделе:
switch(n) {
case 1: // Выполняется, если п === 1
// Выполнить блок 1.
break; // Здесь остановиться
case 2: // Выполняется, если п === 2
// Выполнить блок 2.
break; // Здесь остановиться
case 3: // Выполняется, если п === 3
// Выполнить блок 3.
break; // Здесь остановиться
default: // Если все остальное не подходит...
// Выполнить блок 4.
break; // Здесь остановиться
}
Обратите внимание на ключевое слово break
в конце каждого блока case
. Инструкция break
, описываемая далее в этой главе, приводит к передаче управления в конец инструкции switch
и продолжению выполнения инструкций, следующих далее. Конструкции case
в инструкции switch
задают только начальную точку выполняемого программного кода, но не задают никаких конечных точек. В случае отсутствия инструкций break
инструкция switch
начнет выполнение блока кода с меткой case
, соответствующей значению выражения, и продолжит выполнение инструкций до тех пор, пока не дойдет до конца блока. В редких случаях это полезно для написания программного кода, который переходит от одной метки case
к следующей, но в 99% случаев следует аккуратно завершать каждый блок case
инструкцией break
. (При использовании switch
внутри функции вместо break
можно использовать инструкцию return
. Обе эти инструкции служат для завершения работы инструкции switch
и предотвращения перехода к следующей метке case.)
Ниже приводится более практичный пример использования инструкции switch
; он преобразует значение в строку способом, зависящим от типа значения:
// Преобразовать число в шестнадцатеричное целое
// Вернуть строку, заключенную в кавычки
// Любой другой тип преобразуется обычным способом
function convert(x) {
switch(typeof х) {
case ’number':
return x.toString(16);
case 'string':
return "" + x + "";
default:
return x.toStringO
}
}
Обратите внимание, что в двух предыдущих примерах за ключевыми словами case
следовали числа или строковые литералы. Именно так инструкция switch
чаще всего используется на практике, но стандарт ECMAScript позволяет указывать после case
произвольные выражения.
Инструкция switch
сначала вычисляет выражение после ключевого слова switch
, а затем выражения case
в том порядке, в котором они указаны, пока не будет найдено совпадающее значение.[4] Факт совпадения определяется с помощью оператора идентичности ===
, а не с помощью оператора равенства ==
, поэтому выражения должны совпадать без какого-либо преобразования типов.
Поскольку при каждом выполнении инструкции switch
вычисляются не все выражения case
, следует избегать использования выражений case
, имеющих побочные эффекты, такие как вызовы функций и присваивания. Безопаснее всего ограничиваться в выражениях case
константными выражениями.
Как объяснялось ранее, если ни одно из выражений case
не соответствует выражению switch
, инструкция switch
начинает выполнение с инструкции с меткой default:
. Если метка default:
отсутствует, тело инструкции switch
полностью пропускается. Обратите внимание, что в предыдущих примерах метка default:
указана в конце тела инструкции switch
после всех меток case
. Это логичное и обычное место для нее, но на самом деле она может располагаться в любом месте внутри инструкции switch
.
- 5.4.2. Инструкция else if
- 5.6.2. Инструкция break
- 3.4 Переключатель switch
- Инструкция IIF
- Инструкция INSERT INTO ... FROM ... UNION ...
- Что дает грамотная должностная инструкция
- 2.2.5. ATM Switching
- При запуске программы появляется сообщение Инструкция по адресу 0х77ddb1d1 обратилась к памяти по адресу 0x0080002c. Пам...
- Using Fedora's switchdesk Client
- Making the Switch
- Инструкция по обработке
- Switching