Подтвердить что ты не робот

(true) {... действительный javascript?

Недавно я натолкнулся на код, в котором оператор switch выглядел обратным с ответом (boolean) в коммутаторе и выражениями в этом случае. Код работал нормально, но я беспокоюсь о перекрестном браузере. Действительно ли это javascript?

switch(true) {
  case (y < 20):
    //
    break;
  case (y < 60):
    //
    break;
  case (y < 130):
    //
    break;
}
4b9b3361

Ответ 1

Этот снипп отлично. Это еще один способ выражения:

if (y < 20) {
    // ...
} else if (y < 60) {
    // ...
} else if ( y < 130) {
    // ...
}

Ответ 2

Да, это действительно.

Как и во многих "современных" языках, 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 нет реального улучшения производительности, и в этом случае он не является более кратким и не читаемым.

Ответ 3

Синтаксис оператора 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 или конец блока переключения.

Ответ 4

Случаи будут выполняться на основе значения y.

Поскольку условия зависят от значения y. Как сказано aefxx, это другая форма:

if (y < 20) {
    // ...
} elseif (y < 60) {
    // ...
} elseif ( y < 130) {
    // ...
}

Ответ 5

Это действительно.

Код

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.