GUÍA · Operadores

Diferencia entre == y === en JavaScript

Entiende la diferencia entre igualdad abstracta (==) e igualdad estricta (===) en JavaScript, qué conversiones hace cada una y cuál conviene usar.

=== compara valor y tipo sin convertir nada; == intenta convertir los dos valores a un tipo común antes de comparar. Por eso 5 == '5' es true y 5 === '5' es false. En la práctica, usa === casi siempre.

Igualdad estricta (===)

Dos valores son estrictamente iguales si tienen el mismo tipo y el mismo valor:

JavaScript
console.log(5 === 5);     // true
console.log(5 === '5');   // false (número frente a texto)
console.log(true === 1);  // false
console.log(null === undefined); // false

Igualdad abstracta (==)

Si los tipos son distintos, JavaScript aplica reglas de conversión. Algunas son razonables y otras sorprenden:

JavaScript
console.log(5 == '5');        // true
console.log(0 == false);      // true
console.log('' == 0);         // true
console.log(null == undefined); // true
console.log('0' == false);    // true
console.log([] == false);     // true
console.log(NaN == NaN);      // false

No hace falta memorizar las reglas. Basta con saber que existen y que hacen el resultado difícil de predecir.

Comparar objetos y arrays

Ni == ni === comparan el contenido de objetos o arrays: comparan si son la misma referencia.

JavaScript
const a = { id: 1 };
const b = { id: 1 };
const c = a;

console.log(a === b); // false (dos objetos distintos)
console.log(a === c); // true  (mismo objeto)

Para comparar contenido hay que comparar propiedades una a una o convertir a texto con JSON.stringify cuando el orden y los tipos lo permitan.

El caso de NaN

NaN no es igual a nada, ni siquiera a sí mismo. Para detectarlo, usa Number.isNaN:

JavaScript
console.log(NaN === NaN);          // false
console.log(Number.isNaN(NaN));    // true

¿Cuándo es útil ==?

Hay un uso que muchos equipos aceptan: valor == null, que es true tanto para null como para undefined:

JavaScript
function saludar(nombre) {
  if (nombre == null) {
    return 'Hola, desconocido';
  }
  return 'Hola, ' + nombre;
}

Si prefieres no depender de esa regla, escribe nombre === null || nombre === undefined.

Resumen

  • Usa === y !== por defecto.
  • Convierte los datos de forma explícita cuando haga falta: Number('5') === 5.
  • Recuerda que objetos y arrays se comparan por referencia.
  • Usa Number.isNaN para detectar NaN.

Última actualización: . Los ejemplos se han comprobado en un navegador actual y en Node.js.