Ответ 1
Этот снипп отлично. Это еще один способ выражения:
if (y < 20) {
// ...
} else if (y < 60) {
// ...
} else if ( y < 130) {
// ...
}
Недавно я натолкнулся на код, в котором оператор switch выглядел обратным с ответом (boolean) в коммутаторе и выражениями в этом случае. Код работал нормально, но я беспокоюсь о перекрестном браузере. Действительно ли это javascript?
switch(true) {
case (y < 20):
//
break;
case (y < 60):
//
break;
case (y < 130):
//
break;
}
Этот снипп отлично. Это еще один способ выражения:
if (y < 20) {
// ...
} else if (y < 60) {
// ...
} else if ( y < 130) {
// ...
}
Да, это действительно.
Как и во многих "современных" языках, switch
в Javascript очень далек от исходного switch
на основе языка C, он сохраняет только общую семантику.
Предложение switch, как нормализовано в ECMAScript, подробно описано здесь: http://www.ecma-international.org/ecma-262/5.1/#sec-12.11
В принципе, выполняется первый случай, значение которого равно выражению в switch(Expression)
.
Основным преимуществом над очевидной последовательностью if else if
является возможность опустить оператор break
и выполнить более одного блока. Обратите внимание, что вопреки старому коммутатору C нет реального улучшения производительности, и в этом случае он не является более кратким и не читаемым.
Синтаксис оператора switch :
SwitchStatement : switch ( Expression ) CaseBlock CaseBlock : { CaseClauses(opt) } { CaseClauses(opt) DefaultClause CaseClauses(opt) } CaseClauses : CaseClause CaseClauses CaseClause CaseClause : case Expression : StatementList(opt) DefaultClause : default : StatementList(opt)
Нет, где говорится, что выражение switch или выражение case должно быть числом, строкой, логическим или любым. true
вполне приемлемо в качестве выражения switch, а y < 20
вполне приемлемо в качестве выражения case. Имейте в виду, что сравнение выражения switch и case выражается с помощью оператора ===
.
В отправленном вами коде первый случай true
будет выполняться до тех пор, пока не будет встречен столбец break
или конец блока переключения.
y
.Поскольку условия зависят от значения y
. Как сказано aefxx, это другая форма:
if (y < 20) {
// ...
} elseif (y < 60) {
// ...
} elseif ( y < 130) {
// ...
}
Это действительно.
Код
switch(f0()) {
case f1(): ..;
case f2(): ..;
default: dflt;
}
где fX()
представляет произвольное выражение (вызов функции используется для показа принудительной оценки) можно приблизительно переписать в виде
for (;;) { // for "break"
var _x = f0()
if (_x === f1()) { .. }
if (_x === f2()) { .. }
dflt;
break;
}
То есть выражение в case
оценивается, а затем сравнивается с выражением в switch
. (Это резкое расхождение с такими языками, как C или Java, которые требуют постоянных значений в выражениях case
.)
Конечно, break
будет "выходить из коммутатора" - в отличие от стандартной семантики абзаца - и как таковая, где true
- выражение, предоставленное switch
, опубликованный пример семантически эквивалентен к if/else if
, как показано aefxx.