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