переключатель JavaScript () или если () - PullRequest
2 голосов
/ 19 апреля 2011

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

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;
}

Ответы [ 6 ]

8 голосов
/ 19 апреля 2011

Вы можете использовать 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
}

Представь себе всех этих уродливых и еще, если бы у тебя было иначе.


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

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;

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

2 голосов
/ 31 июля 2016

Оператор 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 такая переменная не нужна, поскольку она более выразительна.

2 голосов
/ 18 октября 2012

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

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

Вот jsPerf группы различных переключателей против операторов if / else if / if == / if ===.

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

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

0 голосов
/ 19 апреля 2011

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

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

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

0 голосов
/ 19 апреля 2011

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

0 голосов
/ 19 апреля 2011

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

...