переключение javascript() или if()

#javascript #if-statement #switch-statement

#javascript #if-оператор #оператор switch

Вопрос:

что было бы лучше, если бы я сделал это:

 if(message == 'redirect')
{
    is_valid.accepted = true;
}
else if(message == 'invalid id')
{
    is_valid.accepted = false;
}
else
{
    is_valid.accepted = false;
}
  

или я делаю это таким образом

 switch (message)
{
case 'invalid id':
default:
    is_valid.accepted = false;
    break;
case 'redirect':
    is_valid.accepted = true;
    break;
}
  

Комментарии:

1. я думаю, вам нужен ваш case 'redirect': блок вверху.

2. похоже ли, что его формат немного отличается от обычного? но я думаю, что следует поместить case 'redirect': обратно сверху, чтобы оно было читаемым

3. Я не знаю, важно ли это, но у меня всегда внизу указано значение по умолчанию. Для меня это более читаемый формат.

Ответ №1:

Вы могли бы использовать switch , если предвидели необходимость добавления большого количества новых обращений.

Если вы не будете добавлять много новых случаев, я мог бы сделать, для ясности:

 is_valid.accepted = message=='redirect';
  

(также обратите внимание, что ваша проверка на «недопустимый идентификатор» ничего не дает)

Тем не менее, если вам пришлось добавлять что-то новое, обратите внимание, как это хорошо, вам не нужно повторяться, не нужно повторяться, не нужно повторяться, а также сексуальное форматирование:

 switch (message)
{
    case 'invalid id':
    case 'penguin invasion':
    case 'the internet is down':
    case 'error not enough caffeine':
        is_valid.accepted = false;
        break;

    case 'redirect':
    case 'upvote me':
    case 'vip':
    case 'flamewar':
        is_valid.accepted = true;
        break;

    default:
        is_valid.accepted = false;
        // perhaps log or something
}
  

Представьте все эти уродливые «еще» и «если бы», которые у вас были бы в противном случае.


примечание: Если у вас были действительно сложные правила, но все еще парадигма «белый список-черный список с одним флагом», тогда:

 var blacklist = ['invalid id', 'penguin invasion', 'the internet is down' 'error not enough caffeine'];
var whitelist = ['redirect', 'upvote me', 'vip', 'flamewar'];

is_valid.accepted = whitelist.indexOf(message)!=-1;
  

Вы также могли бы сделать это, если бы хотели динамически создавать свой белый список.

Комментарии:

1. на самом деле его false для ‘invalid id’ is_valid.accepted = message == 'redirect' будет достаточно

Ответ №2:

Это зависит от вашего определения better. Вы хотите, чтобы это улучшило процесс чтения или производительность?

Я всегда использую jsPerf вещи. На самом деле меня не очень волнует удобочитаемость, если это делает мой код более быстрым / правильным.

Вот jsPerf множества различных операторов switch и if / else if/ if == / if ===.

http://jsperf.com/switch-if-else/16

Это 16-я редакция теста. Поэтому, если вы просматриваете это через 10 недель, обязательно прокрутите страницу вниз и выберите самый последний тест.

Комментарии:

1. ссылка на jsperf равна 404

Ответ №3:

switch Оператор более эффективен / выразителен, чем if/else в некоторых случаях. В то время как следующий if/else оператор

 let x = 123;

if (x) {/*...*/} // implicit type casting (to boolean)
else {/*...*/}
  

может быть легко преобразован в:

 switch (!!x) { // explicit type casting (to boolean)
  case true: /*...*/ break;
  default: /*...*/
}
  

этот switch оператор, с другой стороны

 function algo(x) {/*...performing a complex algorithm...*/}

switch (algo(123)) { // executed once
  case "result 1": /*...*/ break;
  case "result 2": /*...*/ break;
  case "result 3": /*...*/ break;
  default: /*...*/
}
  

приводит к невероятно неэффективному if/else оператору ( switch более эффективен):

 if (algo(123) === "result 1") {/*...*/}
else if (algo(123) === "result 2") {/*...*/}
else if (algo(123) === "result 3") {/*...*/}
else {/*...*/}
  

или требуется if/else с дополнительной переменной, которая объявлена исключительно для этой цели:

 let y = algo(x); // additional variable

if (y === "result 1") {/*...*/}
else if (y === "result 2") {/*...*/}
else if (y === "result 3") {/*...*/}
else {/*...*/}
  

Пожалуйста, обратите внимание, что дополнительные элементы (например, переменные) вызывают большую сложность, а сложность делает программы более подверженными ошибкам. switch Оператору не нужна такая переменная, потому что она более выразительна.

Комментарии:

1. вы хотите сказать, что if else становится более подробным по сравнению с оператором switch?

2. @ianace Нет, не более подробный. switch либо более эффективен (выполняется algo только один раз), либо более выразителен (не требует дополнительной переменной)

Ответ №4:

Switch лучше, если вы работаете с длинным списком возможных условий для одной и той же переменной. В этом случае, я не думаю, что есть много причин использовать switch (), если вы не предпочитаете синтаксис.

Ответ №5:

Если вы используете оператор if, я лично предпочитаю устанавливать значения по умолчанию выше if, вот так:

 is_valid.accepted = false;
if(message == 'redirect')
{
    is_valid.accepted = true;
}
  

Таким образом, вы всегда по умолчанию используете безопасное поведение, которое с меньшей вероятностью нарушится, если вы добавите дополнительные параметры позже. Кроме того, вы сразу видите поведение по умолчанию без необходимости читать логику if-then-else. И это намного более короткий код.

Ответ №6:

Троичный? is_valid.accepted = (message !== 'invalid id') ? true : false;