Вопрос по switch-statement, boolean, javascript – это переключатель (true) {... действительный JavaScript?

19

Недавно я наткнулся на код, в котором оператор switch казался обратным с ответом (логическим) в switch и выражениями в регистре. Код работал нормально, как и предполагалось, но яЯ обеспокоен кросс-браузер. Это действительный JavaScript?

switch(true) {
  case (y < 20):
    //
    break;
  case (y < 60):
    //
    break;
  case (y < 130):
    //
    break;
}
Я также натолкнулся на это в PHP и изменил его на блок if / else if. По моему мнению, кто-то был слишком умен в этом только потому, что вы не можетеЭто значит, что ты должен. Но каждому свое. Shaun Bebbers

Ваш Ответ

5   ответов
2

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

Потому что условия зависят от стоимостиy, Как сказалaefxxЭто другая форма:

if (y < 20) {
    // ...
} elseif (y < 60) {
    // ...
} elseif ( y < 130) {
    // ...
}
@bukart на самом деле, нет. первый разрыв должен быть внутри блока case, который фактически выполняется. Перерыв - это утверждение, которое применяется только тогда, когда вы действительно ударили по нему. отсюда можно сказатьif (x теперь, если х>= y, перерыв никогда не будет иметь никакого эффекта. unsynchronized
нет, этоневерно первый перерыв прыгнет до конца коммутатора! bukart
@bukfixart Обновил ответ. Случаи выполняются на основе y! Praveen Kumar Purushothaman
2

Код

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.

7

Как у многихсовременный" языки,switch в Javascript очень далеко от оригинального Int на основеswitch от языка Си, он сохраняет только общую семантику.

Предложение switch, как нормализовано в ECMAScript, подробно объясняется здесь:http://www.ecma-international.org/ecma-262/5.1/#sec-12.11

По сути, первый случай, значение которого равно выражению вswitch(Expression) выполнен.

Главное преимущество перед очевиднымif else if Последовательность - это способность опускатьbreak оператор и выполнить более одного блока. Обратите внимание, что, в отличие от старого коммутатора C, реального улучшения производительности не происходит, и в этом случаени более кратким, ни более читабельным.

Я не'не говорить о константах, но о int. Примеры: Java (теперь принимает строки), Go (который компилируется), Ruby. Denys Séguret
В C # регистр должен быть постоянным значением. Я'Я уверен, что Java это то же самое. В остальном я бы неСкажем, двух языков много. Ash Burlaczenko
Позволять's добавить C # тоже. В Go кейс по пунктам не делайдолжны быть постоянными вообще. Denys Séguret
Я никогда не говорил, что они не должныне быть постоянными ... Пожалуйста, прочитайте комментарии, которые вы комментируете, прежде чем комментировать. Denys Séguret
12

Этот фрагмент отлично подходит. Это'просто еще один способ выразить:

if (y < 20) {
    // ...
} else if (y < 60) {
    // ...
} else if ( y < 130) {
    // ...
}
s/elseif/else if/elseif это PHP, а не JS. :) sequoia mcdowell
Я бы выразил эквивалентность в терминахif (true == (y < 20))и т. д., чтобы показать, что такое переключательдействительно делает. Например, если это былоswitch(false) это было бы эквивалентноif (false == (y < 20)) и дать разные результаты. user166390
@pst я написал "другой способ выразить не "является точным эквивалентом ". aefxx
Поэтому я и написалЯ бы выразил [это] в терминах " и не "это не правильно" - не надопринять комментарий как плохую вещь. (Хотя мой комментарийявляется неправильно;=== семантика используется и нет).== user166390
7

синтаксис оператора switch является:

  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 или регистр должно быть числом, строкой, логическим значением или чем-то еще.true вполне приемлемо в качестве выражения переключения иy < 20 вполне приемлемо в качестве выражения case. Имейте в виду, что сравнение между выражением-переключателем и выражениями регистра выполняется с использованием=== оператор.

В коде вы разместили первыйtrue дело будет исполнено доbreak встречается или блок переключателей заканчивается.

Похожие вопросы