Ну, вы можете иметь выражения в инструкции case
, поэтому ваш коммутатор не является синтаксической ошибкой. Но вы должны понимать, что Дело № сравнивается с использованием === (строгое сравнение).Как только вы это понимаете, значение должно точно соответствовать значению выражения в вашем switch(expression)
, которое вы можете совершать покупки для выражений в js.
вызовов функции являются выражениями, поэтому давайте попробуем с ними:
function xbox(amount) { return amount >= 10000 && amount < 15000 && amount; }
function reward(amount) {
var ps3 = function(amount) { return amount >= 7500 && amount < 10000 && amount; }
function imac(amount) { return amount >= 15000 && amount; }
var $reward = $("#reward");
switch (amount) {
case ps3(amount):
$reward.text("Play Station 3");
break;
case xbox(amount):
$reward.text("XBOX 360");
break;
case imac(amount):
$reward.text("iMac");
break;
default:
$reward.text("No reward");
break;
}
}
reward(8200)// -> Play Station 3
reward(11000)// -> XBOX 360
reward(20000)// -> iMac
Как вы можете видеть, вы можете определение функций как использовать функцию выражения и. Это не имеет значения. Только то, что выражение в аргументе case является выражением для оценки. Это то же самое, что и вы, только вы не вернули значение, равное сумме, а скорее истинное или ложное значение. В моем примере я возвращаю точную сумму, если мое условие истинно, поэтому вызывать сравнение для соответствия.
Вот ваш фиксированный код:
function reward(amount) {
var $reward = $("#reward");
switch (amount) {
case (amount >= 7500 && amount < 10000 && amount):
$reward.text("Play Station 3");
break;
case (amount >= 10000 && amount < 15000 && amount):
$reward.text("XBOX 360");
break;
case (amount >= 15000 && amount):
$reward.text("iMac");
break;
default:
$reward.text("No reward");
break;
}
}
Вот спецификация: https://tc39.github.io/ecma262/#sec-switch-statement Ссылка на es2016, потому что это проще для поиска, чем старый ES3 PDF с 1999 года Но он всегда работал так, но это малоизвестный факт.
Я, однако, сомневаюсь, что это быстрее, чем if
заявлений. Если вы хотите, чтобы ваш запуск работал быстро, то не коснитесь DOM.
Это лучше, чем ответ, чем «ответ» Дэниелса. С небольшим предупреждением: все выражения до того, что приводит к случаю true, тоже будут оценены. быть осторожен. – 2013-08-19 11:17:04
Да, это работает, потому что вы всегда можете думать о функции переключения, как таблица перехода, она должна только соответствовать и получать значение. Это не похоже на утверждения if else, потому что все, что нужно, нужно оценивать. Вы уже просите свой коммутатор оценить соответствие vs. Вот почему коммутаторы быстрее. – Vontei
@Vontei - Если структура if/else if/else не оценивается, все они оцениваются по очереди только до тех пор, пока не будет выполнено конкретное условие, что является одним и тем же, что происходит при оценке выражений 'case'. – nnnnnn