=== 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:
console.log(5 === 5); // true
console.log(5 === '5'); // false (número frente a texto)
console.log(true === 1); // false
console.log(null === undefined); // falseIgualdad abstracta (==)
Si los tipos son distintos, JavaScript aplica reglas de conversión. Algunas son razonables y otras sorprenden:
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); // falseNo 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.
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:
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:
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.isNaNpara detectarNaN.
Última actualización: . Los ejemplos se han comprobado en un navegador actual y en Node.js.