Включить диапазоны целых чисел в JavaScript
Я хочу сделать что-то вроде этого
switch (this.dealer) {
case 1-4:
// Do something.
break;
case 5-8:
// Do something.
break;
case 9-11:
// Do something.
break;
default:
break;
}
Каков правильный синтаксис для этого? Возможно ли это в JavaScript?
Итак, this.dealer
- целое число, и если оно находится между этими значениями, сделайте что-нибудь.
Ответы
Ответ 1
Вот еще один способ, которым я это понял:
var x = this.dealer;
switch (true) {
case (x < 5):
alert("less than five");
break;
case (x > 4 && x < 9):
alert("between 5 and 8");
break;
case (x > 8 && x < 12):
alert("between 9 and 11");
break;
default:
alert("none");
break;
}
Ответ 2
Приращение ответа MarvinLabs, чтобы сделать его более чистым:
var x = this.dealer;
switch (true) {
case (x < 5):
alert("less than five");
break;
case (x < 9):
alert("between 5 and 8");
break;
case (x < 12):
alert("between 9 and 11");
break;
default:
alert("none");
break;
}
Нет необходимости проверять нижний предел диапазона, потому что операторы break
заставят выполнение пропускать оставшиеся случаи, поэтому к тому времени, когда выполнение будет проверяться, например. (x < 9), мы знаем, что значение должно быть 5 или больше.
Конечно, результат корректен, если случаи остаются в первоначальном порядке, и мы принимаем целочисленные значения (как указано в вопросе) - технически диапазоны находятся между 5 и 8.999999999999 или около того, поскольку все числа в js фактически удваиваются -значные числа с плавающей запятой.
Если вы хотите иметь возможность перемещать случаи вокруг или находить более читаемым, чтобы весь диапазон отображался в каждом случае, просто добавьте меньше или равную проверку для более низкого диапазона для каждого случая:
var x = this.dealer;
switch (true) {
case (x < 5):
alert("less than five");
break;
case (x >= 5 && x < 9):
alert("between 5 and 8");
break;
case (x >= 9 && x < 12):
alert("between 9 and 11");
break;
default:
alert("none");
break;
}
Имейте в виду, что это добавляет дополнительную точку человеческой ошибки - кто-то может попытаться обновить диапазон, но забывайте изменить его в обоих местах, оставив перекрытие или пробел, который не покрывается. например здесь случай 8 теперь не будет соответствовать чему-либо, когда я просто отредактирую случай, который использовался для соответствия 8.
case (x >= 5 && x < 8):
alert("between 5 and 7");
break;
case (x >= 9 && x < 12):
alert("between 9 and 11");
break;
Ответ 3
switch(this.dealer) {
case 1:
case 2:
case 3:
case 4:
// Do something.
break;
case 5:
case 6:
case 7:
case 8:
// Do something.
break;
default:
break;
}
Если вам не нравится последовательность дел, просто перейдите к операторам if/else if/else
.
Ответ 4
Этот не требует оператора switch. Это намного clearer, более сжато и быстрее, чтобы просто использовать инструкции else...
var d = this.dealer;
if (1 <= d && d <= 11) { // making sure in range 1..11
if (d <= 4) {
alert("1 to 4");
} else if (d <= 8) {
alert("5 to 8");
} else {
alert("9 to 11");
}
} else {
alert("not in range");
}
Тест скорости
Мне было интересно узнать, как использовать коммутатор вместо простого, если... else..., поэтому я собрал jsFiddle для его изучения...
http://jsfiddle.net/17x9w1eL/
-
Chrome: переключатель был примерно на 70% медленнее, чем if else
-
Firefox: переключатель был примерно на 5% медленнее, чем if else
-
IE: переключатель был примерно на 5% медленнее, чем if else
-
Safari: переключатель был примерно на 95% медленнее, чем if else
Примечания:
Назначение локальной переменной необязательно, особенно если ваш код будет автоматически оптимизирован позже.
Для числовых диапазонов мне нравится использовать такую конструкцию...
if (1 <= d && d <= 11) {...}
... потому что для меня он читает ближе к тому, как вы выражаете диапазон в математике (1 <= d <= 11), и когда я читаю код, я могу прочитать это как "if d находится между 1 и 11".
Яснее
Несколько человек отметили, что они не считают это более ясным. Это, конечно, не менее понятно, поскольку структура близка к идентичной опции переключателя. Основной причиной, по которой он является более понятным, является то, что каждая его часть читаема и делает простой интуитивный смысл, тогда как "switch (true)" является довольно бессмысленной линией кода. Многие кодеры, читающие, что в вашем script, собираются пойти "WTF это значит?" а затем придется искать его.
Это грязный хак, это не интуитивно, и это непонятно. Если вам нравится код, и никто больше не будет иметь дело с вашей базой кода, тогда идите на это, иначе лучше просто использовать конструкции для того, что они предназначены.
Ответ 5
Нет, это невозможно. Самое близкое, что вы можете получить, это:
switch(this.dealer) {
case 1:
case 2:
case 3:
case 4:
// DO SMTHIN
break;
case 5:
case 6:
case 7:
case 8:
// DO SMTHIN
break;
Но это очень неуклюже.
Для таких случаев обычно лучше использовать структуру if
/else if
.
Ответ 6
Если вам нужны диапазоны проверок, вам, вероятно, будет лучше с операторами if
и else if
, например:
if (range > 0 && range < 5)
{
// ..
}
else if (range > 5 && range < 9)
{
// ..
}
else
{
// Fall through
}
Переключатель может стать большим на больших диапазонах.
Ответ 7
Если вы пытаетесь сделать что-то быстро, эффективно и удобочитаемо, используйте стандартную, если... then... else структуру вроде этого:
var d = this.dealer;
if (d < 12) {
if (d < 5) {
alert("less than five");
}else if (d < 9) {
alert("between 5 and 8");
}else{
alert("between 9 and 11");
}
}else{
alert("none");
}
Если вы хотите запутать его и сделать его ужасным (но маленьким), попробуйте следующее:
var d=this.dealer;d<12?(d<5?alert("less than five"):d<9?alert("between 5 and 8"):alert("between 9 and 11")):alert("none");
Кстати, приведенный выше код - это JavaScript, если... then... else сокращенное утверждение. Это отличный пример того, как НЕ писать код, если целью является обфускация или кодирование кода. Имейте в виду, что обслуживание кода может быть проблемой, если оно написано таким образом. Очень немногие люди могут легко прочитать его, если вообще. Размер кода, однако, на 50% меньше стандартного, если... тогда... еще без потери производительности. Это означает, что в больших кодовых версиях такая минимизация может значительно ускорить доставку кода через сети с ограниченной пропускной способностью или с высокой задержкой.
Это, однако, не следует считать хорошим ответом. Это всего лишь пример того, что МОЖЕТ быть сделано, а не того, что ДОЛЖНО быть сделано.
Ответ 8
Более читаемая версия тройки может выглядеть так:
var x = this.dealer;
alert(t < 1 || t > 11
? 'none'
: t < 5
? 'less than five'
: t <= 8
? 'between 5 and 8'
: 'Between 9 and 11');
Ответ 9
function sequentialSizes(val) {
var answer = "";
switch (val){
case 1:
case 2:
case 3:
case 4:
answer="Less than five";
break;
case 5:
case 6:
case 7:
case 8:
answer="less than 9";
break;
case 8:
case 10:
case 11:
answer="More than 10";
break;
}
return answer;
}
// Change this value to test you code to confirm ;)
sequentialSizes(1);