Pregunta 1En una cadena de else if con >= 50000 primero y >= 100000 después, ¿qué rama se ejecuta si pasas 120000?
Condicionales — else if, el operador ternario y switch
Aprende los condicionales de JavaScript desde cero: else if para evaluar por etapas, el operador ternario que devuelve un valor y switch con break.
Cuando calculas el nivel de un cliente o muestras el estado de un pedido, casi nunca hay solo dos casos posibles. Si escribes los niveles Platino, Oro y Regular como tres if separados, las condiciones de abajo se siguen evaluando aunque una de arriba ya haya decidido el resultado, y aparece una línea por cada condición que se cumple.
En este artículo verás else if para evaluar condiciones por etapas, el operador ternario, que devuelve directamente un valor, y switch, que compara un valor con varios candidatos.
Tres casos o más — encadenar else if
Vamos a elegir una etiqueta a partir de la puntuación media de las reseñas de un producto. Con 4.5 o más es "Excelente"; con 3.5 o más, "Bueno", y por debajo de eso, "Por debajo de la media".
Dos if separados se evalúan de forma independiente, así que con 4.8 se cumplen las dos condiciones y se imprimen dos líneas: "Excelente" y "Bueno".
Si encadenas else if (una condición adicional que solo se evalúa si la anterior no se cumplió), varias condiciones forman una sola estructura de ramificación. El bloque { } que va detrás de cada condición se llama rama.
Las condiciones se evalúan de arriba abajo y solo se ejecuta la primera rama cuya condición se cumple. Si no se cumple ninguna, se ejecuta la rama else.
const score = 4.8; // puntuación media de las reseñas de un producto
// Con if separados, cada uno se evalúa por su cuenta
if (score >= 4.5) {
console.log("Excelente"); // se cumple
}
if (score >= 3.5) {
console.log("Bueno"); // también se cumple → 2 líneas
}
// Con else if, la evaluación termina en la primera rama que se cumple
if (score >= 4.5) {
console.log("Excelente"); // solo se ejecuta esta
} else if (score >= 3.5) {
console.log("Bueno"); // no se llega a evaluar
} else {
console.log("Por debajo de la media"); // no se llega a evaluar
}
Con 4.8 se cumple score >= 4.5 en el primer paso y se sale por la derecha, así que el segundo paso ni siquiera se evalúa. La flecha solo baja al paso siguiente cuando la condición no se cumple.
else es opcional. Si no lo pones y no se cumple ninguna condición, no se ejecuta ninguna rama y el programa sigue en la línea que viene después de toda la estructura.
La tabla muestra en qué paso se detiene la evaluación cuando pasas tres puntuaciones distintas por la misma cadena.
| Puntuación media | Evaluación de arriba abajo | Línea impresa |
|---|---|---|
| 4.8 | Se cumple «4.5 o más» y termina | Excelente (solo 1 línea) |
| 3.8 | «4.5 o más» no; «3.5 o más» sí | Bueno (solo 1 línea) |
| 2.1 | Ninguna se cumple: pasa a else | Por debajo de la media (solo 1 línea) |
El orden de las condiciones cambia el resultado
Si pones primero una condición que abarca un rango más amplio, las condiciones más restrictivas que van debajo nunca se alcanzan. Si escribes primero score >= 3.5, un producto con 4.8 se queda en "Bueno". Para que 4.8 sea "Excelente", empieza por la condición más restrictiva, como score >= 4.5.
Obtener el resultado como valor — el operador ternario
A veces quieres elegir entre "Disponible" y "Agotado" según las existencias y guardar ese texto en una variable para reutilizarlo. Con if y else no puedes usar const, porque una const tiene que recibir su valor en el mismo momento en que se declara. En su lugar, declaras la variable con let y le asignas un valor en cada rama.
El código que produce un valor al evaluarse, como stock > 0, se llama expresión. El código que ejecuta acciones sin producir ningún valor, como if (…) { … }, se llama sentencia.
Con el operador ternario (una expresión que recibe tres partes —una condición, un valor para true y otro para false— y devuelve el valor elegido) puedes escribir las dos ramas en una sola línea.
const stock = 0; // existencias
// if es una sentencia, así que declarar y asignar son pasos separados
let label;
if (stock > 0) {
label = "Disponible";
} else {
label = "Agotado";
}
console.log(label); // Agotado
// El operador ternario es una expresión, así que va directo a una const
const badge = stock > 0 ? "Disponible" : "Agotado";
console.log(badge); // Agotado
// También funciona dentro de un template literal
console.log(`Estado: ${stock > 0 ? "Puedes comprarlo" : "Pendiente de reposición"}`); // Estado: Pendiente de reposición
Cuando necesitas tres resultados o más, vuelve a else if. Puedes anidar operadores ternarios, pero entonces ? y : aparecen una y otra vez en la misma línea, como en a ? x : b ? y : z, y tienes que seguir con la vista qué condición corresponde a qué valor.
Elegir según un solo valor — switch y case
Vamos a elegir un mensaje de comisión según el método de pago que eligió el cliente. Podrías escribirlo con else if, pero repetirías la misma variable una y otra vez (paymentMethod === "credit", paymentMethod === "convenience") y costaría ver a simple vista qué se está comparando.
Con switch (una sentencia que compara un valor con varios candidatos en orden y empieza a ejecutar desde la rama que coincide), escribes el valor que se compara una sola vez entre paréntesis y enumeras los candidatos como case valor:. El break al final de una rama sale del switch, y cuando no coincide ningún case se ejecuta la rama default:.
const paymentMethod = "credit"; // método de pago que eligió el cliente
switch (paymentMethod) {
case "credit":
console.log("Sin comisión"); // se ejecuta esta
break;
case "convenience":
console.log("Comisión: 200 yenes"); // pago en tienda de conveniencia; no coincide
break;
case "cod":
console.log("Comisión: 330 yenes"); // pago contra entrega; no coincide
break;
default:
console.log("Elige un método de pago");
}
default es opcional. Si un valor que no coincide con nada llega a un switch sin default, no se ejecuta ninguna rama y el programa sigue en la línea siguiente. Cuando pueden llegar valores que no están entre tus candidatos, imprimir un mensaje en default te permite ver en pantalla que llegó algo inesperado.
case distingue entre cadenas y números
switch compara igual que ===, así que valores de tipos distintos nunca coinciden. La cadena "200" leída de un campo de entrada no entra en case 200: y pasa a default. Si un valor puede llegar como número o como cadena, conviértelo a un solo tipo antes de compararlo.
Seguir en el case siguiente — omitir break
Un error habitual con switch es olvidarse de escribir break. El código sigue siendo válido, así que no hay error de sintaxis; solo te das cuenta al ejecutarlo y ver líneas de más en la salida.
Sin break, la ejecución continúa con el código de los case que están debajo del que coincidió. A esto se le llama fall-through (caída a los case siguientes). La ejecución sigue, sin comparar con los valores de los case de abajo, hasta que encuentra un break o llega al final del switch.
const orderStatus = "paid"; // estado del pedido
// Sin break, también se ejecuta el código que hay debajo del case que coincide
switch (orderStatus) {
case "paid":
console.log("Pagado"); // coincide y empieza aquí
case "shipped":
console.log("Enviado"); // no hay break, así que sigue
default:
console.log("Revisa el estado"); // se ejecuta hasta default
}
// Si apilas varios case, varios candidatos comparten el mismo bloque de código
switch (orderStatus) {
case "pending":
case "paid":
console.log("Aún sin enviar"); // tanto pending como paid llegan aquí
break;
}
Este comportamiento te sirve cuando quieres que varios candidatos compartan el mismo código. Si apilas dos etiquetas case sin código entre ellas, cuando coincide la de arriba la ejecución pasa directamente al código de abajo. Pon un break al final de la rama compartida.
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 2¿Qué devuelve total >= 5000 ? 0 : 500 cuando total vale 5000?
Pregunta 3¿Qué pasa si te olvidas de escribir break al final de un case?