A veces necesitamos que, bajo condiciones diferentes, se ejecuten acciones diferentes.
Para esto podemos usar la sentencia if y el âoperador condicionalâ ?.
La sentencia âifâ
La sentencia if(...) evalúa la condición en los paréntesis, y si el resultado es verdadero (true), ejecuta un bloque de código.
Por ejemplo:
let year = prompt('¿En que año fué publicada la especificación ECMAScript-2015?', '');
if (year == 2015) alert( '¡Estás en lo cierto!' );
Aquà la condición es una simple igualdad (year == 2015), pero podrÃa ser mucho más compleja.
Si queremos ejecutar más de una sentencia, debemos encerrar nuestro bloque de código entre llaves:
if (year == 2015) {
alert( "¡Es Correcto!" );
alert( "¡Eres muy inteligente!" );
}
Recomendamos encerrar nuestro bloque de código entre llaves {} siempre que se utilice la sentencia if, incluso si solo se va a ejecutar una sola sentencia. Al hacerlo mejoramos la legibilidad.
Conversión Booleana
La sentencia if (â¦) evalúa la expresión dentro de sus paréntesis y convierte el resultado en booleano.
Recordemos las reglas de conversión del capÃtulo Conversiones de Tipos:
- Los valores: número
0, string vacÃo"",null,undefined, yNaN, en un contexto booleano se convierten enfalse. Por ello, sin ser booleanos, se los conoce como valores âfalsyâ. - El resto de los valores se convierten en
true, y son valores que llamamos âtruthyâ.
Entonces, el código bajo esta condición nunca se ejecutarÃa:
if (0) { // 0 es falsy
...
}
â¦y dentro de esta condición siempre se ejecutará:
if (1) { // 1 es truthy
...
}
También podemos pasar un valor booleano pre-evaluado al if, asÃ:
let cond = (year == 2015); // la igualdad se evalúa y devuelve un true o false
if (cond) {
...
}
La cláusula âelseâ
La sentencia if puede contener un bloque else (âsi noâ, âen caso contrarioâ) opcional. Este bloque se ejecuta cuando la condición resulta falsa.
Por ejemplo:
let year = prompt('¿En qué año fue publicada la especificación ECMAScript-2015?', '');
if (year == 2015) {
alert( '¡Lo adivinaste, correcto!' );
} else {
alert( '¿Cómo puedes estar tan equivocado?' ); // cualquier valor excepto 2015
}
Muchas condiciones: âelse ifâ
A veces queremos probar más de una condición. La clausula else if nos permite hacer esto.
Por ejemplo:
let year = prompt('¿En qué año fue publicada la especificación ECMAScript-2015?', '');
if (year < 2015) {
alert( 'Muy poco...' );
} else if (year > 2015) {
alert( 'Muy Tarde' );
} else {
alert( '¡Exactamente!' );
}
En el código de arriba, JavaScript primero revisa si year < 2015. Si esto es falso, continúa a la siguiente condición year > 2015. Si esta también es falsa, mostrará la última alert.
PodrÃa haber más bloques else if. Y el último else es opcional.
Operador ternario â?â
A veces necesitamos que el valor que asignemos a una variable dependa de alguna condición.
Por ejemplo:
let accessAllowed;
let age = prompt('¿Qué edad tienes?', '');
if (age > 18) {
accessAllowed = true;
} else {
accessAllowed = false;
}
alert(accessAllowed);
El âoperador condicionalâ nos permite ejecutar esto en una forma más corta y simple.
El operador está representado por el signo de cierre de interrogación ?. A veces es llamado âternarioâ porque el operador tiene tres operandos, es el único operador de JavaScript que tiene esa cantidad.
La Sintaxis es:
let result = condition ? value1 : value2;
Se evalúa condition: si resulta verdadera entonces devuelve value1 , de lo contrario value2.
Por ejemplo:
let accessAllowed = (age > 18) ? true : false;
Técnicamente, podemos omitir el paréntesis alrededor de age > 18. El operador de signo de interrogación tiene una precedencia baja, por lo que se ejecuta después de la comparación >.
En este ejemplo realizaremos lo mismo que en el anterior:
// el operador de comparación "age > 18" se ejecuta primero de cualquier forma
// (no necesitamos agregar los paréntesis)
let accessAllowed = age > 18 ? true : false;
Pero los paréntesis hacen el código mas legible, asi que recomendamos utilizarlos.
En el ejemplo de arriba, podrÃas evitar utilizar el operador de signo de interrogación porque esta comparación devuelve directamente true/false:
// es lo mismo que
let accessAllowed = age > 18;
Múltiples â?â
Una secuencia de operadores de signos de interrogación ? puede devolver un valor que depende de más de una condición.
Por ejemplo:
let age = prompt('¿edad?', 18);
let message = (age < 3) ? '¡Hola, bebé!' :
(age < 18) ? '¡Hola!' :
(age < 100) ? '¡Felicidades!' :
'¡Qué edad tan inusual!';
alert( message );
Puede ser difÃcil al principio comprender lo que está sucediendo. Pero después de una mirada más cercana, podemos ver que es solo una secuencia ordinaria de condiciones:
- El primer signo de pregunta revisa si
age < 3. - Si es cierto, devuelve
'¡Hola, bebé!'. De lo contrario, continúa a la expresión que está después de los dos puntos â:â, la cual revisa siage < 18. - Si es cierto, devuelve
'¡Hola!'. De lo contrario, continúa con la expresión que está después de los dos puntos siguientes â:â, la cual revisa siage < 100. - Si es cierto, devuelve
'¡Felicidades!'. De lo contrario, continúa a la expresión que está después de los dos puntos â:â, la cual devuelve'¡Qué edad tan inusual!'.
Aquà lo podemos ver utilizando if..else:
if (age < 3) {
message = '¡Hola, bebé!';
} else if (age < 18) {
message = '¡Hola!';
} else if (age < 100) {
message = '¡Felicidades!';
} else {
message = '¡Qué edad tan inusual!';
}
Uso no tradicional de â?â
A veces, el signo de interrogación de cierre ? se utiliza para reemplazar un if:
let company = prompt('¿Qué compañÃa creó JavaScript?', '');
(company == 'Netscape') ?
alert('¡Correcto!') : alert('Equivocado.');
Dependiendo de la condición company == 'Netscape', se ejecutará la primera o la segunda expresión del operador ? y se mostrará una alerta.
Aquà no asignamos el resultado a una variable. En vez de esto, ejecutamos diferentes códigos dependiendo de la condición.
No recomendamos el uso del operador de signo de interrogación de esta forma.
La notación es más corta que la sentencia equivalente con if, lo cual seduce a algunos programadores. Pero es menos legible.
Aquà está el mismo código utilizando la sentencia if para comparar:
let company = prompt('¿Cuál compañÃa creó JavaScript?', '');
if (company == 'Netscape') {
alert('¡Correcto!');
} else {
alert('Equivocado.');
}
Nuestros ojos leen el código verticalmente. Los bloques de código que se expanden múltiples lineas son mas fáciles de entender que los las instrucciones largas horizontales.
El propósito del operador de signo de interrogación ? es para devolver un valor u otro dependiendo de su condición. Por favor utilÃzala para exactamente esto. Utiliza la sentencia if cuando necesites ejecutar código en ramas distintas.
Comentarios
<code>, para varias lÃneas â envolverlas en la etiqueta<pre>, para más de 10 lÃneas â utilice una entorno controlado (sandbox) (plnkr, jsbin, codepenâ¦)