← JavaScript

Fundamentos

¿Cuál es la diferencia entre `==` y `===`?

Ver respuesta — intenta responderla en voz alta primero

=== compara valor y tipo sin convertir nada (igualdad estricta). == convierte los tipos antes de comparar (igualdad flexible con coerción). La recomendación es usar siempre ===.

  • === (igualdad estricta): solo devuelve true si ambos valores son del mismo tipo y tienen el mismo valor. No hace ninguna conversión.
  • == (igualdad flexible): si los tipos difieren, JavaScript intenta convertirlos a un tipo común antes de comparar. Esto produce resultados sorprendentes.

Por eso la recomendación general es usar ===: es predecible y evita errores.

// === compara valor y tipo
console.log(5 === 5);       // true
console.log(5 === "5");     // false (number vs string)

// == convierte los tipos antes de comparar
console.log(5 == "5");      // true  ("5" se convierte a 5)
console.log(0 == false);    // true  (false se convierte a 0)
console.log("" == false);   // true  (ambos se convierten a 0)
console.log(null == undefined); // true (caso especial)

// Casos que confunden con ==
console.log([] == false);   // true
console.log(" " == 0);      // true (el espacio se convierte a 0)

// Con === todo es más predecible
console.log(0 === false);   // false
console.log(null === undefined); // false

Usar == "porque funciona" en casos simples y luego toparse con errores raros como que [] == false sea true. Las reglas de coerción de == son difíciles de recordar y llevan a errores sutiles.

"=== es la igualdad estricta: compara valor y tipo sin convertir. == es la igualdad flexible: si los tipos no coinciden, JavaScript convierte uno de ellos antes de comparar, lo que produce resultados inesperados como que 0 == false sea true. Yo uso siempre === porque es predecible; solo usaría == a propósito para un caso concreto, como valor == null para comprobar null y undefined a la vez."

Reto rápido

Predice cada resultado:

console.log(1 == true);
console.log(1 === true);
console.log("0" == 0);
console.log("0" === 0);
Ver respuesta

true, false, true, false. Con == hay coerción (true se convierte a 1, "0" a 0); con === los tipos difieren, así que es false.