Tema
Operadores
Los operadores son los símbolos que te permiten hacer cosas con los datos: sumar precios, comparar edades, decidir si un usuario puede entrar o asignar un valor por defecto cuando falta información. En esta lección conocerás todos los operadores que usarás a diario, incluyendo los modernos ?? y ?., y la famosa diferencia entre == y ===.
Concepto
Un operador toma uno o más valores (llamados operandos) y produce un resultado:
js
const total = 250 + 180;
// ↑ ↑ ↑
// operando op operando → resultado: 430Piensa en los operadores como los botones de una calculadora, pero con superpoderes: además de sumar y restar, pueden comparar, combinar condiciones y elegir valores.
Operadores aritméticos
js
const a = 17;
const b = 5;
console.log(a + b); // 22 suma
console.log(a - b); // 12 resta
console.log(a * b); // 85 multiplicación
console.log(a / b); // 3.4 división
console.log(a % b); // 2 residuo (módulo): lo que sobra de 17 / 5
console.log(a ** 2); // 289 potencia: 17 al cuadrado
// Incremento y decremento
let visitas = 10;
visitas++; // visitas = 11
visitas--; // visitas = 10El operador % (módulo) es más útil de lo que parece:
js
// ¿Es par? Si el residuo de dividir entre 2 es 0, sí
console.log(8 % 2 === 0); // true
console.log(7 % 2 === 0); // false
// Convertir minutos a horas y minutos
const minutosTotales = 135;
const horas = Math.floor(minutosTotales / 60); // 2
const minutos = minutosTotales % 60; // 15
console.log(`${horas} h ${minutos} min`); // 2 h 15 minError común
Los decimales en JavaScript (y en casi todos los lenguajes) no son exactos:
js
console.log(0.1 + 0.2); // 0.30000000000000004 😵
console.log((0.1 + 0.2).toFixed(2)); // "0.30" ✅Con dinero, redondea al mostrar con toFixed(2) o trabaja en centavos (enteros): $19.99 → 1999.
Operadores de asignación
js
let total = 100;
total += 50; // total = total + 50 → 150
total -= 20; // total = total - 20 → 130
total *= 2; // total = total * 2 → 260
total /= 4; // total = total / 4 → 65
total %= 10; // total = total % 10 → 5
total **= 2; // total = total ** 2 → 25
// Con texto, += concatena
let mensaje = 'Hola';
mensaje += ', bienvenido'; // "Hola, bienvenido"También existen asignaciones lógicas (ES2021), muy útiles para valores por defecto:
js
let config = { tema: null, idioma: 'es' };
config.tema ??= 'claro'; // asigna sólo si es null o undefined → "claro"
config.idioma ||= 'en'; // asigna sólo si es falsy → sigue "es"Operadores de comparación
Siempre devuelven un booleano (true o false):
js
const edad = 20;
console.log(edad > 18); // true mayor que
console.log(edad < 18); // false menor que
console.log(edad >= 20); // true mayor o igual
console.log(edad <= 19); // false menor o igual
console.log(edad === 20); // true estrictamente igual
console.log(edad !== 20); // false estrictamente diferente== vs ===: la gran diferencia
==(igualdad débil): convierte los tipos antes de comparar. Produce resultados sorprendentes.===(igualdad estricta): compara valor y tipo. Sin trucos.
js
console.log(5 == '5'); // true 😬 convirtió el texto a número
console.log(5 === '5'); // false ✅ number vs string
console.log(0 == false); // true 😬
console.log(0 === false); // false ✅
console.log('' == 0); // true 😬
console.log(null == undefined); // true
console.log(null === undefined);// falseBuena práctica
Usa siempre === y !==. Te ahorrarás errores muy difíciles de encontrar. La única excepción que algunos equipos aceptan es valor == null, que detecta null y undefined a la vez, aunque hoy es más claro usar ??.
Operadores lógicos
Sirven para combinar condiciones:
&&(Y / AND): devuelvetruesi ambas condiciones son verdaderas.||(O / OR): devuelvetruesi al menos una es verdadera.!(NO / NOT): invierte el valor.
js
const edad = 25;
const tieneINE = true;
const esVIP = false;
// Puede entrar al evento si es mayor de edad Y tiene identificación
console.log(edad >= 18 && tieneINE); // true
// Envío gratis si es VIP O la compra supera $999
const compra = 1200;
console.log(esVIP || compra > 999); // true
// Negación
console.log(!esVIP); // trueTruthy y falsy
En JavaScript, cualquier valor puede evaluarse como verdadero o falso en una condición. Sólo hay 8 valores falsy; todo lo demás es truthy:
js
// Valores FALSY (se comportan como false)
false
0
-0
0n
'' // string vacío
null
undefined
NaN
// Todo lo demás es TRUTHY, incluso:
'0' // string con un cero
'false' // string con la palabra false
[] // array vacío
{} // objeto vacíoEsto permite escribir condiciones más cortas:
js
const nombre = '';
if (!nombre) {
console.log('El nombre es obligatorio'); // se ejecuta, '' es falsy
}Cortocircuito: && y || devuelven valores
&& y || no siempre devuelven true/false: devuelven uno de los operandos.
js
// || devuelve el primer valor truthy
const nombreUsuario = '' || 'Invitado';
console.log(nombreUsuario); // "Invitado"
// && devuelve el primer valor falsy, o el último si todos son truthy
const usuario = { nombre: 'Ana' };
console.log(usuario && usuario.nombre); // "Ana"
// Ejecutar algo sólo si se cumple una condición
const hayErrores = true;
hayErrores && console.log('Revisa el formulario');Nullish coalescing ??
?? devuelve el lado derecho sólo si el izquierdo es null o undefined. A diferencia de ||, respeta valores como 0 o ''.
js
const stock = 0;
console.log(stock || 'Sin dato'); // "Sin dato" ❌ ¡pero el stock es 0, sí hay dato!
console.log(stock ?? 'Sin dato'); // 0 ✅
const descuento = null;
console.log(descuento ?? 0); // 0Encadenamiento opcional ?.
Te permite acceder a propiedades que podrían no existir sin que el programa truene:
js
const pedido = {
id: 1024,
cliente: { nombre: 'Luis' },
};
// Sin ?. esto lanza: TypeError: Cannot read properties of undefined
// console.log(pedido.envio.direccion);
console.log(pedido.envio?.direccion); // undefined (sin error)
console.log(pedido.cliente?.nombre); // "Luis"
// Combinado con ?? para un valor por defecto
const ciudad = pedido.envio?.ciudad ?? 'Recoger en tienda';
console.log(ciudad); // "Recoger en tienda"
// También con métodos que quizá no existan
pedido.notificar?.(); // no hace nada si notificar no existeEsto es muy común al trabajar con datos de APIs (Fetch y APIs), donde algunos campos pueden venir vacíos.
Operador ternario
Es un if/else en una línea: condición ? valorSiTrue : valorSiFalse.
js
const edad = 16;
const acceso = edad >= 18 ? 'Permitido' : 'Denegado';
console.log(acceso); // "Denegado"
// Muy útil dentro de template literals
const articulos = 1;
console.log(`Tienes ${articulos} ${articulos === 1 ? 'artículo' : 'artículos'}`);Lo verás con más detalle en Condicionales.
Precedencia de operadores
Igual que en matemáticas, algunos operadores se evalúan antes que otros. De mayor a menor (simplificado):
- Agrupación
( ) !,++,--,typeof***,/,%+,-<,>,<=,>====,!==,==,!=&&||,??? :(ternario)=,+=,-=... (asignación)
js
console.log(2 + 3 * 4); // 14, no 20
console.log((2 + 3) * 4); // 20
// Calcular total con IVA y descuento
const precio = 500;
const total = precio - precio * 0.1 + (precio - precio * 0.1) * 0.16;
// ✅ Más claro con variables intermedias y paréntesis
const conDescuento = precio * (1 - 0.1); // 450
const totalFinal = conDescuento * 1.16; // 522Buena práctica
Si tienes que pensar en la precedencia, usa paréntesis o divide la operación en variables con buenos nombres. El código se lee muchas más veces de las que se escribe.
Ejemplo completo: calculadora de IMC
Esta demo combina operadores aritméticos (/, **), de comparación y lógicos para validar y clasificar el resultado:
La parte clave del cálculo:
js
const peso = Number(inputPeso.value); // kg
const estaturaM = Number(inputEstatura.value) / 100; // cm → m
// Validación con operadores lógicos y de comparación
if (!peso || !estaturaM || peso <= 0 || estaturaM <= 0) {
console.log('Datos inválidos');
} else {
const imc = peso / (estaturaM ** 2); // potencia y división
console.log(imc.toFixed(1));
}Ejercicios
- Un producto cuesta
$1,250y tiene 15 % de descuento. Calcula el precio final con IVA (16 %) y muéstralo con dos decimales. - Predice el resultado:
'7' == 7,'7' === 7,null ?? 'a',0 || 'b',0 ?? 'c',!!'hola'. - Dado
const usuario = { perfil: null };, obténusuario.perfil.fotosin error y, si no existe, usa'avatar.png'.
Ver solución
1.
js
const precio = 1250;
const conDescuento = precio * (1 - 0.15); // 1062.5
const total = conDescuento * 1.16; // 1232.5
console.log(`$${total.toFixed(2)}`); // $1232.502.
js
'7' == 7; // true (convierte tipos)
'7' === 7; // false (tipos distintos)
null ?? 'a'; // "a"
0 || 'b'; // "b" (0 es falsy)
0 ?? 'c'; // 0 (0 no es null ni undefined)
!!'hola'; // true (doble negación = convertir a booleano)3.
js
const usuario = { perfil: null };
const foto = usuario.perfil?.foto ?? 'avatar.png';
console.log(foto); // "avatar.png"Resumen
- Aritméticos:
+ - * / % **; el%sirve para pares/impares y conversiones. - Asignación:
+=,-=,??=, etc. abrevian operaciones. - Compara siempre con
===y!==, nunca con==. - Lógicos:
&&(y),||(o),!(no); devuelven uno de los operandos. - Sólo hay 8 valores falsy:
false,0,-0,0n,'',null,undefined,NaN. ??da un valor por defecto sólo antenull/undefined;?.evita errores con propiedades inexistentes.- El ternario es un
if/elsecompacto. - Ante la duda de precedencia, usa paréntesis.
Siguiente: Condicionales