JavaScript tiene comparaciones estrictas y de conversión de tipos. Una comparación estricta (por ejemplo, ===
) solo es verdadera si los operandos son del mismo tipo y los contenidos coinciden. La comparación abstracta más comúnmente utilizada (por ejemplo, ==
) convierte los operandos al mismo tipo antes de hacer la comparación. Para las comparaciones abstractas relacionales (p. Ej., <=
), Los operandos primero se convierten en primitivos, y luego en el mismo tipo, antes de la comparación.
Las cadenas se comparan en base al orden lexicográfico estándar, utilizando valores Unicode.
console.log(1 == 1)
// Esperamos True
console.log("1" == 1 )
// Esperamos true
console.log( 1 === 1)
// Esperamos true
console.log( "1" === 1)
// Esperamos false
Características de las comparaciones:
- Dos cadenas son estrictamente iguales cuando tienen la misma secuencia de caracteres, la misma longitud y los mismos caracteres en las posiciones correspondientes.
- Dos números son estrictamente iguales cuando son numéricamente iguales (tienen el mismo valor numérico). NaN no es igual a nada, incluido NaN. Los ceros positivos y negativos son iguales entre sí.
- Dos operandos booleanos son estrictamente iguales si ambos son
true
o ambos sonfalse
. - Dos objetos distintos nunca son iguales para comparaciones estrictas o abstractas.
- Una expresión que compara objetos solo es verdadera si los operandos hacen referencia al mismo objeto.
- Los tipos Null y Undefined son estrictamente iguales a ellos mismos y abstractivamente iguales entre sí.
Operadores de igualdad
Igualdad (==)
El operador de igualdad convierte los operandos si no son del mismo tipo, luego aplica una comparación estricta. Si ambos operandos son objetos, entonces JavaScript compara las referencias internas que son iguales cuando los operandos se refieren al mismo objeto en la memoria.
Sintaxis
x == y
Ejemplos
1 == 1 // true
'1' == 1 // true
1 == '1' // true
0 == false // true
0 == null // false
var object1 = {'key': 'value'}, object2 = {'key': 'value'};
object1 == object2 // false
0 == undefined // false
null == undefined // true
Desigualdad (!=)
El operador de desigualdad devuelve verdadero si los operandos no son iguales. Si los dos operandos no son del mismo tipo, JavaScript intenta convertir los operandos a un tipo apropiado para la comparación. Si ambos operandos son objetos, entonces JavaScript compara las referencias internas que no son iguales cuando los operandos se refieren a diferentes objetos en la memoria.
Sintaxis
x != y
Ejemplos
1 != 2 // true
1 != '1' // false
1 != "1" // false
1 != true // false
0 != false // false
Identidad / igualdad estricta (===)
El operador de identidad devuelve verdadero si los operandos son estrictamente iguales (ver arriba) sin conversión de tipo.
Sintaxis
x === y
Ejemplos
3 === 3 // true
3 === '3' // false
var object1 = {'key': 'value'}, object2 = {'key': 'value'};
object1 === object2 // false
Sin identidad / desigualdad estricta (!==)
El operador sin identidad devuelve verdadero si los operandos no son iguales y / o no del mismo tipo.
Sintaxis
x !== y
Ejemplos
3 !== '3' // true
4 !== 3 // true
Operadores relacionales
Cada uno de estos operadores llamará a la función valueOf()
en cada operando antes de realizar una comparación.
Operador mayor que (>)
El operador mayor que, devuelve verdadero si el operando izquierdo es mayor que el operando derecho.
Sintaxis
x > y
Ejemplos
4 > 3 // true
Operador mayor o igual (>=)
El operador mayor o igual que, devuelve verdadero si el operando izquierdo es mayor o igual que el operando derecho.
Sintaxis
x >= y
Ejemplos
4 >= 3 // true
3 >= 3 // true
Operador menor que (<)
El operador menor que devuelve verdadero si el operando de la izquierda es menor que el operando de la derecha.
Sintaxis
x < y
Ejemplos
3 < 4 // true
Operador menor o igual (<=)
El operador menor o igual devuelve verdadero si el operando izquierdo es menor o igual que el operando derecho.
Sintaxis
x <= y
Ejemplos
3 <= 4 // true
Usando los operadores de igualdad
Los operadores de igualdad estándar (==
y !=
) utilizan el Algoritmo de Comparación de Igualdad Abstracta para comparar dos operandos. Si los operandos son de tipos diferentes, intentará convertirlos al mismo tipo antes de hacer la comparación, por ejemplo, en la expresión 5 == '5'
, la cadena de la derecha se convierte a Number
antes de realizar la comparación.
Los operadores de igualdad estricta (===
y !==
) usan el Algoritmo de Comparación de Igualdad Estricta y están destinados a realizar comparaciones de igualdad en operandos del mismo tipo. Si los operandos son de tipos diferentes, el resultado siempre es false
, entonces 5 !== '5'
.
Utilice operadores de igualdad estrictos si los operandos deben ser de un tipo específico así como de valor o si el tipo exacto de los operandos es importante. De lo contrario, utilice los operadores de igualdad estándar, que le permiten comparar la identidad de dos operandos, incluso si no son del mismo tipo.
Cuando la conversión de tipo está involucrada en la comparación (es decir, comparación no estricta), JavaScript convierte los tipos String
, Number
, Boolean
o Object
operandos de la siguiente manera:
- Al comparar un número y una cadena, la cadena se convierte en un valor numérico. JavaScript intenta convertir el literal numérico de cadena a un valor de tipo
Number
. Primero, un valor matemático se deriva del literal numérico de cadena. A continuación, este valor se redondea al valor de tipoNumber
más cercano. - Si uno de los operandos es
Boolean
, el operandoBoolean
se convierte en 1 si estrue
y +0 si esfalse
. - Si un objeto se compara con un número o cadena, JavaScript intenta devolver el valor predeterminado para el objeto. Los operadores intentan convertir el objeto a un valor primitivo, un valor
String
oNumber
, utilizando los métodosvalueOf
ytoString
de los objetos. Si falla este intento de convertir el objeto, se genera un error de tiempo de ejecución. - Tenga en cuenta que un objeto se convierte en una primitiva si, y solo si, su comparando es una primitiva. Si ambos operandos son objetos, se comparan como objetos, y la prueba de igualdad es verdadera solo si ambos refieren el mismo objeto.
// true, ya que ambos operandos son de tipo String (es decir, primitivas de cadena):
'foo' === 'foo'
var a = new String('foo');
var b = new String('foo');
// false como a y b son tipo Objeto y referencia a diferentes objetos
a == b
// false como a y b son tipo Objeto y referencia a diferentes objetos
a === b
// true como a y 'foo' son de tipo diferente y, el Objeto (a)
// se convierte en cadena 'foo' antes de la comparación
a == 'foo'
Especificaciones
Especificación | Estado | Comentario |
---|---|---|
ECMAScript 1st Edition (ECMA-262) | Standard | Definición inicial. Implementado en JavaScript 1.0 |
ECMAScript 3rd Edition (ECMA-262) | Standard |
Agrega |
ECMAScript 5.1 (ECMA-262) | Standard |
Definido en varias secciones de la especificación: Operadores Relacionales, Operadores de Igualdad |
ECMAScript 2015 (6th Edition, ECMA-262) | Standard |
Definido en varias secciones de la especificación: Operadores Relacionales, Operadores de Igualdad |
ECMAScript (ECMA-262) | Living Standard |
Definido en varias secciones de la especificación: Operadores Relacionales, Operadores de Igualdad |