En JavaScript, los valores se dividen en dos categorías: truthy
y falsy
. Estos términos se refieren a cómo se comportan los valores cuando se evalúan como un booleano.
- Los valores
truthy
evalúan como valores verdaderos - Los valores
falsy
evalúan como valores falsos
Esta conversión automática ocurre cuando el valor se emplea en un contexto que espera un booleano (por ejemplo, cuando se usan como condición en un condicional, o se comparan con un operador).
truthy
y falsy
son dos conceptos que se usan muchísimo en JavaScript. Pero no os preocupéis, que son muy sencillos de entender.
Si las palabritas te resultan algo absurdas tranquilo/a… no eres al único 😄
Valores Falsy
Los valores falsy
son aquellos que, cuando se evalúan en un contexto booleano, se consideran como false
.
Hay solo seis valores en JavaScript que se consideran falsy
:
false
: El valor booleanofalse
es obviamente falsy.0
: El número cero es falsy.""
(cadena vacía): Una cadena sin caracteres es falsy.null
: Representa la ausencia de cualquier valor y es falsy.undefined
: Significa que una variable ha sido declarada pero no asignada, y es falsy.NaN
: Significa “Not-a-Number” lo cual es falsy (es el resultado de una operación matemática inválida)
Vamos a verlo con un ejemplo,
if (!0) {
console.log("0 es un valor falsy");
}
if (!null) {
console.log("null es un valor falsy");
}
Valores Truthy
Los valores truthy
son aquellos que, cuando se evalúan en un contexto booleano, se consideran como true
.
Cualquier valor que no sea falsy
se considera truthy
. Esto incluye prácticamente todo lo demás:
- Números distintos de 0: Todos los números diferentes de
0
, ya sean positivos o negativos - Cadenas no vacías: Cualquier cadena con al menos un carácter, incluyendo “0” o “false”
- Objetos y arrays: Cualquier objeto o array, incluso vacíos
- El valor booleano
true
: Obviamente 😉
Por ejemplo,
if ("hello") {
console.log("Una cadena no vacía es truthy");
}
if ({}) {
console.log("Un objeto vacío es truthy");
}
Importancia de Truthy
y Falsy
En JavaScript (y en otros lenguajes en menor medida), algunos programadores tienen la costumbre confiar en la evaluación implícita de estas propiedades para “simplificar” el código.
Así se ahorran comparar explícitamente con true
o false
(que les deben cobrar las letras o algo)
Por ejemplo:
let username = "John";
if (username) {
console.log("El usuario ha proporcionado un nombre");
} else {
console.log("El nombre de usuario está vacío");
}
En este código,
username
se evalúa directamente en la condición delif
.- Si
username
es una cadena no vacía (truthy
), la primera rama se ejecutará. - Si es una cadena vacía (
falsy
), se ejecutará la segunda rama.
A ver como digo esto… no hagáis eso. No confiéis en las conversiones automáticas a booleanos
Si queréis hacer una comprobación, hacerla correctamente. Porque luego os cambian cualquier cosa en el código, y vuestro condicional pasa a funcionar incorrectamente