Bueno, puede tener expresiones en la declaración case
por lo que su conmutador no es un error de sintaxis. Pero debe comprender que la Case Clause se compara usando === (comparación estricta).Una vez que comprenda esto, que el valor debe coincidir exactamente con el valor de expresión en su switch(expression)
, puede buscar expresiones en js.
llamadas a funciones son expresiones, por lo que vamos a tratar con ellos:
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
Como se puede ver, se puede ambas expresiones de funciones de uso y definiciones de funciones. No importa. Solo que la expresión en la cláusula de caso es una expresión para evaluar. Lo cual es lo mismo que tú, solo que no devolviste un valor que era igual al monto, sino más bien un valor verdadero o falso. En mi ejemplo, devuelvo la cantidad exacta si mi condición es verdadera, por lo tanto, disparo la comparación para que coincida.
Aquí es su código fijo:
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;
}
}
Aquí es la especificación: https://tc39.github.io/ecma262/#sec-switch-statement El enlace es a es2016 porque es más fácil para buscar que el anterior pdf ES3 de 1999. Pero siempre ha trabajado de esta manera, pero es un hecho poco conocido.
Sin embargo, dudo que esto sea más rápido que las declaraciones if
. Si desea que su ejecución se ejecute rápidamente, entonces no toque el DOM.
Esto es mejor como respuesta que la "respuesta" de Daniels. Con una ligera advertencia: todas las expresiones anteriores a la que conduce al caso verdadero también serán evaluadas. ten cuidado. –
Sí, esto funciona porque siempre se puede pensar en una función de interruptor como una tabla de salto, solo tiene que coincidir y recuperar un valor. Esto es diferente de las sentencias if/else porque todas las if deben evaluarse realmente. Por encima de ti estás pidiendo a tu interruptor que evalúe el partido. Es por eso que los casos de cambio son más rápidos. – Vontei
@Vontei: con una estructura if/else if/else no se evalúan * todos *, solo se evalúan hasta que una condición en particular sea verdadera, que es lo mismo que ocurre al evaluar expresiones 'case'. – nnnnnn