Operadores Lógicos de JavaScript (&&, ||, !)
Los operadores lógicos son fundamentales para controlar el flujo y la toma de decisiones en JavaScript. Esta guía ayuda a principiantes a entenderlos.
Los operadores lógicos son fundamentales para controlar el flujo y la toma de decisiones en JavaScript. Esta guía explica cómo usar los operadores lógicos de JavaScript—&&, ||, !, el relacionado ??, y el idioma !!—y, lo que es igual de importante, los dos comportamientos que confunden a la mayoría: la evaluación de cortocircuito y la semántica de retorno de valores. Todos los ejemplos a continuación son ejecutables.
Descripción General de los Operadores Lógicos de JavaScript
Los operadores lógicos evalúan uno o más operandos y devuelven un valor. Son una parte fundamental de los operadores de JavaScript y se usan con mayor frecuencia dentro de condiciones, pero hacen mucho más que producir true/false:
&&(AND lógico)||(OR lógico)??(Operador de Fusión Nula — técnicamente distinto, pero resuelve el mismo problema de "elegir un valor")!(NOT lógico)!!(Doble NOT — el idioma de conversión a Boolean)
Valores truthy y falsy
Antes de que los operadores tengan sentido, debes saber qué trata JavaScript como "verdadero" y "falso" en un contexto Boolean. Existen exactamente ocho valores falsy; todo lo demás es truthy.
Esto importa porque &&, || y ! evalúan los operandos en función de su truthiness, no estrictamente según el Boolean true. Consulta Tipos de Datos de JavaScript para conocer los tipos de valores subyacentes.
Evaluación de cortocircuito y retorno de valores
Dos reglas rigen casi todo lo que hacen estos operadores:
- Cortocircuito: la evaluación se detiene en cuanto el resultado es conocido. El operando del lado derecho puede que nunca se ejecute.
- Devuelven un operando, no un Boolean:
&&y||devuelven uno de los valores originales, notrue/false.
Esto es exactamente por qué || funciona como selector de valor predeterminado y por qué && funciona como guardia, como se muestra más adelante.
AND lógico (&&)
En un contexto Boolean, && es true solo cuando ambos operandos son truthy. Más precisamente, devuelve el primer operando falsy, o el último operando si todos son truthy. Úsalo cuando varias condiciones deben cumplirse, o como guardia que ejecuta el lado derecho solo cuando el lado izquierdo es truthy.
En este ejemplo, tanto isLoggedin como hasPermissions deben ser truthy para que se conceda el acceso. Si alguno es falsy, se deniega el acceso — y gracias al cortocircuito, si isLoggedin es false, hasPermissions ni siquiera se evalúa.
OR lógico (||)
En un contexto Boolean, || es true cuando al menos un operando es truthy. Más precisamente, devuelve el primer operando truthy, o el último operando si todos son falsy. Esto es lo que lo convierte en un operador de respaldo / valor predeterminado.
Aquí, la operación puede continuar si networkStatus es 'good' o savedOffline es true, proporcionando un respaldo cuando la red está en mal estado.
Operador de Fusión Nula (??)
El operador ?? devuelve su lado derecho solo cuando el lado izquierdo es null o undefined (llamados colectivamente nullish). Ignora otros valores falsy como 0, '' y false. Esa única diferencia es lo que lo distingue de ||.
Aquí itemCount es 0. Con ??, defaultCount se mantiene en 0 porque 0 no es nullish — por lo tanto, un cero legítimo se conserva.
?? vs ||
|| usa el respaldo con cualquier valor falsy; ?? lo hace solo con null/undefined. Cuando 0, '' o false son entradas válidas, esa distinción es una medida real de prevención de errores.
Usa ?? cuando solo quieras un valor predeterminado para "ningún valor en absoluto", y mantén || cuando cualquier valor falsy deba activar el respaldo.
No puedes mezclar ?? con && o || sin paréntesis — a || b ?? c es un SyntaxError. Escribe (a || b) ?? c para hacer explícito el agrupamiento.
NOT lógico (!)
El operador ! invierte la truthiness de su operando y siempre devuelve un Boolean. Es útil para alternar estados o verificar negaciones de condiciones.
Este ejemplo comprueba si isActive es false y, en caso afirmativo, indica que se requiere activación.
Doble NOT (!!)
Aplicar ! dos veces convierte cualquier valor a su equivalente Boolean: el primer ! lo invierte (y coerciona a Boolean), el segundo lo vuelve a invertir. El resultado representa estrictamente true o false.
!!0 se evalúa como false porque 0 es un valor falsy en JavaScript. El doble NOT clarifica la conversión a Boolean.
Uso de !! para Verificar el Estado Boolean de una Propiedad de object
A veces, quieres verificar si una propiedad de un object no solo está presente, sino también que es truthy. El operador !! es perfecto para convertir cualquier valor a un contexto estrictamente Boolean, dejando claro y explícito si la propiedad cumple las condiciones.
Considera un escenario donde tienes un object de usuario que podría tener una propiedad llamada isActive. Quieres realizar una acción solo si isActive no está simplemente presente, sino que es truthy.
En este ejemplo:
- El object de usuario tiene una propiedad
isActiveque esundefined. - Usar
!!user.isActiveconvierteundefinedafalse. - Como
isActiveesundefined(que es un valor falsy),!!undefinedresulta enfalse, y la salida será "John is not active."
Escenarios de Uso Práctico
Renderizado Condicional
Este fragmento demuestra el uso de && para el renderizado condicional, mostrando 'UserDashboard' solo cuando isLoggedIn es true.
Gestión de Valores Predeterminados con OR Lógico
Si currentUser es null, userName toma por defecto el valor 'Guest'. Esto garantiza que un saludo siempre sea personalizado.
Simplificación de Condiciones Complejas
Este código otorga acceso completo solo a los usuarios verificados que son administradores o editores, combinando tanto && como ||. Los paréntesis son importantes — consulta la precedencia de operadores a continuación.
Precedencia de Operadores
Cuando se mezclan operadores, JavaScript los evalúa en un orden fijo. De mayor a menor precedencia entre estos:
!(NOT lógico) — mayor precedencia&&(AND lógico)||(OR lógico) y??(estos tienen la misma precedencia, que es por qué no pueden mezclarse sin paréntesis)
Los operadores de comparación (<, ===, etc.) se vinculan más estrechamente que && y ||, por lo que se evalúan primero. Consulta Operadores de Comparación para más detalles.
En caso de duda, agrega paréntesis. No cuestan nada y hacen la intención inequívoca.
Buenas Prácticas
- Evita la Complejidad: Mantén las expresiones lógicas simples. Si se vuelven demasiado complejas, divídelas en partes más pequeñas y manejables.
- Aprovecha el Cortocircuito: Utiliza la naturaleza de cortocircuito de
&&y||para optimizar el rendimiento evitando evaluaciones innecesarias. - Conversión Explícita a Boolean: Usa
!!para convertir claramente valores a true o false, mejorando la legibilidad y previsibilidad de tu código. - Comparaciones Consistentes: Asegura tipos de datos consistentes en las comparaciones para evitar comportamientos inesperados debidos a la coerción de tipos de JavaScript.
Conclusión
Los operadores lógicos son esenciales para escribir JavaScript efectivo. Recuerda las dos ideas que explican casi todo lo que hacen: la evaluación de cortocircuito (el operando derecho puede que nunca se ejecute) y el retorno de valores (&& y || devuelven uno de los operandos, no un Boolean). Usa ?? en lugar de || siempre que 0, '' o false sean valores válidos, y agrega paréntesis siempre que la precedencia no sea clara.
Para profundizar, consulta el Operador Condicional (Ternario) para elegir entre dos valores en línea, y Operadores de Comparación para construir las condiciones que alimentan las expresiones lógicas.