Todo valor tiene su "estado de ánimo" booleano
En JavaScript puedes meter cualquier valor donde se espera un booleano: dentro de un if, como condición de un while, o junto a && o ||. Cuando lo haces, ese valor se convierte a true o false mediante coerción booleana. Los valores que se convierten en false se llaman falsy, y el resto son truthy.
Sin funciones de conversión ni casts explícitos: JavaScript lo hace solo. Las reglas son pocas y están fijadas, así que en cuanto memorices la lista de valores falsy, todo lo demás cae por su propio peso.
Lista completa de valores falsy en JavaScript
Solo hay siete valores falsy. Absolutamente todo lo demás en el lenguaje es truthy.
Eso es todo. La lista completa:
false— el booleano en sí.0y-0— ambos ceros.0n— el cero de BigInt.""— la cadena vacía (con comillas simples, dobles o backticks, da igual).null— el valor "intencionalmente nada".undefined— el valor "sin asignar".NaN— el resultado de operaciones inválidas como0 / 0.
Memoriza estos siete. Después, cuando tengas dudas sobre cualquier valor, pregúntate: "¿está entre esos siete?". Si la respuesta es no, es truthy.
Las sorpresas: "0", [] y {}
Aquí es donde más se tropiezan los principiantes. Hay un montón de valores que parecen vacíos pero en realidad son truthy:
Las cadenas solo son falsy cuando no tienen ningún carácter. "0" tiene un carácter, así que es truthy. Los arrays y objetos son siempre truthy —incluso cuando están vacíos—, porque JavaScript los trata como objetos, y todos los objetos son truthy sin importar lo que contengan.
Si vienes de Python, este es el mayor cambio de chip. En Python, [] y {} son falsy. En JavaScript, no.
Cómo comprobar si algo está "vacío" correctamente
Como [] y {} son truthy, no puedes usarlos directamente en un if para saber si están vacíos. Hay que ser explícito:
Lo mismo pasa con los strings: si quieres tratar una cadena con solo espacios como vacía:
Truthy/falsy es un atajo cómodo, pero no te exime de pensar qué significa "vacío" para tus datos.
Cómo convertir un valor a booleano real
A veces necesitas un true o false de verdad, no un valor meramente truthy. Hay dos formas idiomáticas de hacerlo:
Boolean(x) es la conversión explícita. !!x es lo mismo pero en versión corta: el primer ! convierte a booleano y lo invierte, y el segundo ! lo vuelve a invertir. Las dos formas se usan un montón. !! es más breve; Boolean() se lee más claro.
La doble negación !! aparece mucho en sentencias return, cuando quieres que una función devuelva un booleano limpio:
Truthy y falsy con && y ||
Los operadores lógicos en JavaScript no devuelven true ni false: devuelven uno de los operandos. Cuál de los dos te toca depende de si el valor es truthy o falsy:
Por eso value || defaultValue es un patrón tan habitual para asignar valores por defecto. Pero tiene una trampa: considera todos los valores falsy por igual, incluidos 0 y "", que muchas veces son entradas perfectamente válidas:
Si lo que quieres es usar un valor por defecto únicamente cuando tengas null o undefined, recurre al operador de coalescencia nula ??. Tienes un documento dedicado a ese tema.
Chuleta rápida
Imprímela, pégala en el monitor y sigue con tu vida.
Siguiente: iteradores y generadores
Ya dominas los condicionales y los bucles, así que en el próximo capítulo veremos cómo JavaScript permite que los valores se produzcan bajo demanda. Los iteradores y generadores son la maquinaria detrás de for...of, el spread y buena parte de las APIs modernas: los vemos a continuación.
Preguntas frecuentes
¿Cuáles son los valores falsy en JavaScript?
Son exactamente siete: false, 0, -0, 0n (el cero de BigInt), '' (string vacío), null, undefined y NaN. Todo lo demás es truthy, incluidos '0', 'false', [] y {}. Si te aprendes esa lista corta de falsy, el resto sale por descarte.
¿Un array vacío es truthy o falsy en JavaScript?
Truthy. El bloque if ([]) { ... } se ejecuta, cosa que sorprende a quien viene de Python o PHP. Los arrays y los objetos son objetos, y todos los objetos son truthy independientemente de lo que contengan. Para comprobar si un array está vacío, usa arr.length === 0 de forma explícita.
¿Cómo convierto un valor a booleano en JavaScript?
Tienes dos formas: Boolean(value) es la versión explícita y !!value es el atajo (una doble negación que convierte y vuelve a invertir). Ambas siguen las mismas reglas de truthy/falsy. Úsalas cuando necesites un true/false de verdad y no solo un valor "que parezca" truthy.