¿Cuál es la diferencia entre == y === en Javascript?

A continuación te daré un respuesta breve y sin rodeos. Pero para utilizar estos operadores de manera efectiva te conviene conocerlos más a fondo, así que te recomiendo continuar leyendo hasta el final del artículo.

Respuesta concisa

Si los valores que se van a comparar no son del mismo tipo, el operador de igualdad relajada (==)

  • primero convierte el tipo de uno de ellos para que los 2 valores tengan un tipo de dato común
  • luego realiza la comparación

Por ejemplo, si los valores a comparar son el valor numérico 3 y el valor de texto (string) ‘3’:

JavaScript
// el string '3' es convertido al valor numérico 3
// luego se comparan dos valores numéricos: 3 y 3
// lo cual resulta en true

'3' == 3 // 👉 true

El operador de igualdad estricta (===), a diferencia del operador de igualdad relajada (==), no realiza conversión de tipos, sino que considera que dos valores de diferente tipo son valores diferentes. Nunca considerará a dos valores de tipo distinto como valores iguales.

JavaScript
// Operador de igualdad relajada
3 == '3' // 👉 true
3 == 3   // 👉 true

// Operador de igualdad estricta
3 === '3' // 👉 false
3 === 3   // 👉 true

Ambos operadores (== y ===) devuelven un valor booleano.

Operador de igualdad relajada (==)

Al operador de igualdad relajada también se le llama operador de igualdad débil, igualdad regular o igualdad abstracta. De aquí en adelante, utilizaremos el término “operador de igualdad relajada”.

JavaScript
3 == '3' // 👉 true
'3' == 3 // 👉 true
1 == true // 👉 true
0 == false // 👉 true

'false' == false // 👉 false
3 == true // 👉 false
0 == null // 👉 false
0 == undefined // 👉 false

null == undefined // 👉 true

Si uno de los operandos es booleano y el otro operando no lo es, convierte el booleano a un valor numérico. Por ejemplo, true es convertido al número 1, y false es convertido al número 0. Luego se vuelven a comparar los operandos.

JavaScript
1 == true // 👉 true, aquí true es convertido a 1
0 == false // 👉 true, aquí false es convertido a 0

Si se compara un valor numérico con un valor de texto (string), se intenta convertir el texto (string) a un número. Una falla en la conversión resulta en NaN y la comparación devolverá false.

NaN por sus siglas en inglés representa Not-A-Number.

JavaScript
// '123' es convertido a 123 
// devuelve true
'123' == 123 // 👉 true

// 'Leo' no puede ser convertido en número 
// intentar convertir 'Leo' a número resulta en NaN
// así que devuelve false
'Leo' == 123 // 👉 false

Si uno de los operandos es null o undefined, el otro también debe ser null o undefined para resultar en true, de lo contrario resulta en false.

JavaScript
0 == null // false
0 == undefined // false
false == null // false
false == undefined // false 
null == undefined // true

Operador de igualdad estricta (===)

El operador de igualdad estricta comprueba si sus dos operandos son iguales y devuelve un resultado booleano. Cuando los dos operandos son de distinto tipo de dato, siembre devuelve false.

JavaScript
// A continuación, resulta en false en todos los casos
// porque todas estas comparaciones son valores
// de tipo de dato diferente
3 === '3' // false
'3' === 3 // false
1 === true // false
3 === true // false
0 === false // false
0 === null // false
0 === undefined // false
null === undefined // false

// A continuación, resulta en true porque ambos, 
// tanto el valor como el tipo de dato son iguales
3 === 3 // true
'3' === '3' // true

Comparando objetos con == y ===

Al comparar objetos, el operador de igualdad relajada (==) devuelve true si los dos operandos hacen referencia al mismo objeto.

Al comparar objetos, el operador de igualdad estricta (===) se comporta de manera similar al operador de igualdad relajada.

JavaScript
// ==
const empresa1 = {
  nombre: 'ABC Company'
};

const empresa2 = {
  nombre: 'ABC Company'
};

empresa1 == empresa2 // 👉 false
empresa1 == empresa1 // 👉 true

// ===
const libro1 = {
  titulo: 'Codigo Limpio'
};

const libro2 = {
  titulo: 'Codigo Limpio'
};

libro1 === libro2 // 👉 false
libro1 === libro1 // 👉 true

empresa1 == empresa1 devuelven true porque los dos operandos apuntan al mismo objeto.

Por otro lado, empresa1 === empresa2 devuelve false porque los operandos empresa1 y empresa2 son instancias de objetos diferentes.

💡 Observa que los objetos empresa1 y empresa2 tienen el mismo contenido: ambos tienen la propiedad nombre con el valor ‘ABC Company’. Lo mismo puede decirse de los objetos libro1 y libro2: ambos tienen la propiedad titulo con el valor ‘Codigo Limpio’. Aún así, cuando se comparan objetos con la misma estructura, empresa1 == empresa2, devuelve false.

Igualdad referencial es útil cuando deseas comparar referencias a objetos, mas bien que su contenido.

¿Cuándo debería utilizar == vs ===?

La recomendación general es utilizar el operador de igualdad estricta (===) porque su resultado es más predecible, funciona como lo esperas.

Si compara valores de tipo diferente, el operador de igualdad relajada (==) primero efectúa una conversión en el tipo de uno de los operadores, y esto en ocasiones puede producir resultados no esperados.

La lista completa de reglas de igualdad relajada es un tanto complicada y difícil de memorizar.

Para muestra, un botón:

JavaScript
false == 'false' // 👉 false
false == '0' // 👉 true 🤯

A menos de que entiendas a cabalidad las conversiones que suceden con ==, en la gran mayoría de los casos es preferible usar ===.

Referencias sobre igualdad en Javascript

He aquí un par de referencias útiles sobre comparación de valores en Javascript.

Similar Posts