¿Qué operador igual (== vs ===) debería usarse en las comparaciones de JavaScript?
Estoy usando JSLint para revisar JavaScript y devuelve muchas sugerencias para reemplazar ==
(dos signos iguales) con ===
(tres signos iguales) al hacer cosas como comparar idSele_UNVEHtype.value.length == 0
dentro de una if
declaración.
¿Existe algún beneficio de rendimiento al reemplazar ==
con ===
?
Cualquier mejora en el rendimiento sería bienvenida ya que existen muchos operadores de comparación.
Si no se realiza ninguna conversión de tipos, ¿habría una mejora en el rendimiento ==
?
El operador de igualdad estricta ( ===
) se comporta de manera idéntica al operador de igualdad abstracta ( ==
), excepto que no se realiza ninguna conversión de tipos y los tipos deben ser los mismos para que se consideren iguales.
Referencia: Tutorial de JavaScript: operadores de comparación
El ==
operador comparará la igualdad después de realizar las conversiones de tipos necesarias . El ===
operador no realizará la conversión, por lo que si dos valores no son del mismo tipo ===
simplemente devolverá false
. Ambos son igualmente rápidos.
Para citar el excelente JavaScript de Douglas Crockford : The Good Parts ,
JavaScript tiene dos conjuntos de operadores de igualdad:
===
y!==
y sus gemelos malvados==
y!=
. Los buenos funcionan como cabría esperar. Si los dos operandos son del mismo tipo y tienen el mismo valor, entonces===
producetrue
y!==
producefalse
. Los gemelos malvados hacen lo correcto cuando los operandos son del mismo tipo, pero si son de diferentes tipos, intentan coaccionar los valores. Las reglas por las que lo hacen son complicadas e inolvidables. Estos son algunos de los casos interesantes:
'' == '0' // false 0 == '' // true 0 == '0' // true
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r\n ' == 0 // true
La falta de transitividad es alarmante. Mi consejo es que nunca uses a los gemelos malvados. En su lugar, utilice siempre
===
y!==
. Todas las comparaciones que se acaban de mostrar se producenfalse
con el===
operador.
Actualizar
@Casebash mencionó un buen punto en los comentarios y en la respuesta de @Phillipe Laybaert sobre los objetos. Para objetos, y actúan coherentemente unos con otros (salvo caso especial).==
===
var a = [1,2,3];
var b = [1,2,3];
var c = { x: 1, y: 2 };
var d = { x: 1, y: 2 };
var e = "text";
var f = "te" + "xt";
a == b // false
a === b // false
c == d // false
c === d // false
e == f // true
e === f // true
El caso especial es cuando se compara una primitiva con un objeto que se evalúa como la misma primitiva, debido a su método toString
o valueOf
. Por ejemplo, considere la comparación de una cadena primitiva con un objeto de cadena creado usando el String
constructor.
"abc" == new String("abc") // true
"abc" === new String("abc") // false
Aquí el ==
operador verifica los valores de los dos objetos y regresa true
, pero ===
ve que no son del mismo tipo y regresa false
. ¿Cuál es correcto? Eso realmente depende de lo que intentes comparar. Mi consejo es omitir la pregunta por completo y simplemente no usar el String
constructor para crear objetos de cadena a partir de literales de cadena.
Referencia
https://262.ecma-international.org/5.1/#sec-11.9.3
Usando el ==
operador ( Igualdad )
true == 1; //true, because 'true' is converted to 1 and then compared
"2" == 2; //true, because "2" is converted to 2 and then compared
Usando el ===
operador ( Identidad )
true === 1; //false
"2" === 2; //false
Esto se debe a que el operador de igualdad ==
escribe coercion , lo que significa que el intérprete intenta implícitamente convertir los valores antes de comparar.
Por otro lado, el operador de identidad ===
no escribe coerción y, por lo tanto, no convierte los valores al comparar.
Aquí hay una visualización interesante de la comparación de igualdad entre ==
y ===
.
Fuente: https://github.com/dorey/JavaScript-Equality-Table ( demostración , demostración unificada )
var1 === var2
Cuando se utiliza ===
para pruebas de igualdad de JavaScript, todo es como está.
Nada se convierte antes de ser evaluado.
var1 == var2
Cuando se utiliza ==
para pruebas de igualdad de JavaScript, se producen algunas conversiones extrañas .
Resumen de igualdad en Javascript
Conclusión:
Utilice siempre===
, a menos que comprenda completamente las extrañas conversiones que tienen lugar con ==
.