CodeForge

JavaScript de Cero a Experto / Operadores y control

Operadores lógicos: &&, || y ??

Teoría20 min20 XP

Las decisiones reales rara vez dependen de UNA condición: "si alcanza el saldo Y hay stock", "si es fin de semana O festivo". Los operadores lógicos —&&, ||, !— combinan condiciones para formar preguntas complejas. Y conocerás ??, el operador moderno para valores por defecto que evita una trampa clásica.

Y, O, NO

Cortocircuito: JavaScript es perezoso (para bien)

JavaScript evalúa las condiciones de izquierda a derecha y PARA en cuanto sabe el resultado:

cortocircuito.js
// con && : si el PRIMERO es false, ya no revisa el segundo (todo será false)
false && carisimoDeCalcular();   // no ejecuta la función: ya sabe que es false

// con || : si el PRIMERO es true, ya no revisa el segundo (todo será true)
true || carisimoDeCalcular();    // no ejecuta la función: ya sabe que es true

Esto se llama "cortocircuito" y no es solo eficiencia: es un patrón útil. usuario && usuario.nombre solo lee .nombre SI usuario existe (evita el error de leer una propiedad de "nada"). Lo verás mucho.

?? : valores por defecto sin trampa

Un uso clásico de || es dar un valor por defecto: "usa el nombre, o 'Invitado' si no hay". Pero tiene una trampa, y ?? la resuelve:

La diferencia: || usa el default para cualquier valor "falsy" (incluidos 0 y "", que a veces SON válidos), mientras que ?? (nullish coalescing) solo lo usa para null o undefined —el verdadero "no hay nada"—. Para valores por defecto, ?? suele ser lo que quieres: respeta el 0 y el string vacío como datos legítimos. (Qué es "falsy" lo desmenuza la próxima lección.)

Un usuario puede tener 0 mensajes sin leer. Escribes const noLeidos = datos.noLeidos || 5. Si datos.noLeidos es 0, ¿qué pasa y qué deberías usar?

Mini-reto

En "Mi Bolsillo": crea condiciones combinadas. Con const saldo = 50000, const precio = 30000, const promoActiva = true, evalúa: ¿puedes comprar Y aprovechar la promo? (saldo >= precio && promoActiva). ¿Es día de compra si esQuincena O hayDescuento? Y usa ?? para un const limiteDiario = config.limite ?? 100000 que respete un límite de 0 si el usuario lo pone a propósito.

Qué sigue

Usaste || y ?? con valores "falsy", pero ¿qué cuenta EXACTAMENTE como verdadero o falso cuando no es un boolean puro? La próxima lección revela las reglas de "truthy" y "falsy" —cómo JavaScript decide si un valor cualquiera "vale como true"—, clave para escribir condiciones limpias.