El condicional ternario (también conocido como operador ternario) es una estructura de control que permite evaluar una condición y retornar un valor en función de esa condición.
A diferencia de los condicionales IF-ELSE, el condicional ternario se compone de una única línea de código y tiene la siguiente sintaxis general:
resultado = condicion ? valor_si_cierto : valor_si_falso
En esta expresión:
- Se evalúa la condición
- Si es
true
, se devuelvevalor_verdadero
- Si es
true
, se devuelvevalor_falso
Esta estructura es muy útil cuando se necesita asignar un valor a una variable en función de una condición.
Al igual que en el resto de los condicionales condicion
tiene que ser una expresión que evalúa a un valor booleano. Es decir, tiene que ser una de las siguientes expresiones,
false
otrue
- Una variable booleana
- Una expresión que evalúa como booleano
- La llamada de una función que devuelve un booleano
El operador ternario se llama así porque, en general, es el único operador de un lenguaje que tiene tres parámetros. El resto suelen tener uno parámetro, como el operador negación !mivariable
o dos, cómo los operadores suma a+b
Equivalente en IF-ELSE
Si hacemos el equivalente en un bloque IF-ELSE del operador terciario, quedaría algo así.
let resultado
if(condicion) resultado = valor_si_cierto
else resultado = valor_si_falso
Como vemos es algo (ligeramente) más largo.
Ejemplos de operador ternario en distintos lenguajes
Como decía muchos lenguajes implementan el operador ternario como forma de comparación.
Por ejemplo, en el caso de C, C++, Java y C#, el condicional ternario tiene la siguiente forma,
int edad = 18;
string resultado = edad >= 18 ? "Eres mayor de edad" : "Eres menor de edad";
En este ejemplo, utilizamos el condicional ternario en C# para asignar un mensaje de acuerdo a la edad. Si la edad es mayor o igual a 18, se asigna el mensaje “Eres mayor de edad”, de lo contrario se asigna el mensaje “Eres menor de edad”.
En JavaScript el operador ternario es idéntico. En el ejemplo solo varía que JavaScript no declara el tipo de las variables, pero la sintaxis del condicional es la misma.
let edad = 18;
let resultado = edad >= 18 ? "Eres mayor de edad" : "Eres menor de edad";
En Python el condicional es algo diferente, y tiene la siguiente forma.
edad = 18
resultado = "Eres mayor de edad" if edad >= 18 else "Eres menor de edad"
Por poner un ejemplo más bizarro, enSQLel operador ternario no existe, y en su lugar se proporciona una función IFF
que cumple el mismo papel.
IIF(@type = 2, 1, 0)
Anidamiento de operadores ternarios
Al igual que el resto de los operadores el condicional ternario se puede encadenar. Con esto se puede generar condicionales más complejos, como por ejemplo.
let condition1 = false;
let condition2 = true;
let b = condition1 ? 'true1'
: condition2 ? 'true2'
: 'false_both';
En algunas circunstancias esto puede mejorar la legibilidad del código. Pero no conviene abusar de ello porque, en general, podéis montar sentencias muy complicadas de leer.
Buenas prácticas Consejos
Mantenlo simple y legible: El operador ternario puede ser útil para expresar lógica condicional de manera concisa. Sin embargo, evita abusar de él y asegúrate de que la expresión sea fácil de entender y no se vuelva demasiado compleja.
Evita anidar operadores ternarios: Anidar múltiples operadores ternarios puede dificultar la legibilidad del código. En general, evítalo.
No hagas llamadas a funciones pesadas: El operador ternario debe ser siempre sencillo. No lo uses para
var a = validarDatos() ? valor_true : valor_false;
En su lugar, prefiere
var isValid = validarDatos()
var a = isValid ? valor_true : valor_false;
Prefiere claridad a brevedad:. A la mínima de si el código queda más legible o menos, considera utilizar condicionales IF-ELSE o descomponer la lógica en múltiples líneas para hacerla más clara y comprensible.
Usa paréntesis para evitar ambigüedades: Si tienes expresiones más complejas que involucran operadores ternarios, utiliza paréntesis para asegurarte de que la evaluación se realice correctamente y evitar ambigüedades en la precedencia de operadores.
Relación con paradigma funcional Avanzado
Suele decirse que el condicional ternario sigue el paradigma de la programación funcional. Bueno, eso no es exactamente cierto. Digamos que es “más dado” a la programación funcional que un IF. Pero que sea funcional o no depende totalmente de cómo lo usemos.
Por ejemplo, si lo usamos como es habitual, evaluando una condición y devolviendo un valor u otro, es programación funcional.
let resultado = condicion ? 'si' : 'no'
Si en lugar de devolver una variable o un literal, realizo una llamada a una función, empezamos a acercarnos a la zona roja.
function funcion_si() {
// no hago nada
return 'si'
}
function funcion_no() {
// no hago nada
return 'no'
}
let resultado = condicion ? funcion_si() : funcion_no();
En el ejemplo anterior, las funciones de valor pero no realizan acciones. Sigue siendo programación funcional, pero menos que antes.
Si en este ejemplo, en lugar de devolver un valor realizáramos acciones, ya no sería funcional. Por ejemplo, lo siguiente,
function funcion_si() {
// hago cosas y no devuelvo nada
}
function funcion_no() {
// hago cosas y no devuelvo nada
}
condicion ? funcion_si() : funcion_no();
Eso no es en absoluto funcional (por mucho que estés usando un condicional ternario). Aquí se está usando el operador ternario para hacer una bifurcación de código. Ni siquiera estamos empleando el valor resuelto.
Que no digo que no sea correcto (para mi limpio no es, pero es debatible). Lo que desde luego no es es funcional.
Así que si algún día tenéis una conversación sobre esta, lo correcto es decir “el operador ternario facilita un paradigma funcional”, pero no es funcional. Dependerá de cómo lo usemos.