Estoy usando JSLint para pasar por JavaScript, y está devolviendo 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.
¿Hay una ventaja de rendimiento a reemplazar ==
con ===
?
Cualquier mejora en el rendimiento sería bienvenida ya que existen muchos operadores de comparación.
Si no se lleva a cabo una conversión de tipo, ¿se produciría un aumento de rendimiento ==
?
=== vs ==
, pero en PHP, puede leer aquí: stackoverflow.com/questions/2401478/why-is-faster-than-in-php/…===
es mucho más rápido que==
. jsperf.com/comparison-of-comparisons===
over==
. De hecho, el punto de referencia no muestra una gran diferencia entre ambos en los navegadores modernos. Personalmente, suelo usarlo en==
todas partes a menos que realmente necesite una igualdad estricta.===
y==
: youtube.com/… Si no funciona, es a las 15:20Respuestas:
El operador de igualdad estricta (
===
) se comporta de manera idéntica al operador de igualdad abstracto (==
), excepto que no se realiza una conversión de tipo, y los tipos deben ser los mismos para ser considerados iguales.Referencia: Tutorial de Javascript: Operadores de comparación
El
==
operador comparará la igualdad después de realizar las conversiones de tipo necesarias . El===
operador no realizará la conversión, por lo que si dos valores no son del mismo tipo===
, simplemente regresaráfalse
. Ambos son igualmente rápidos.Para citar el excelente JavaScript de Douglas Crockford : The Good Parts ,
Actualizar:
@Casebash trajo un buen punto en los comentarios y en la respuesta de @Phillipe Laybaert sobre los objetos. Para objetos,
==
y===
actuar consistentemente entre sí (excepto en un caso especial).El caso especial es cuando se compara una primitiva con un objeto que se evalúa en el mismo primitivo, debido a su
toString
ovalueOf
método. Por ejemplo, considere la comparación de una primitiva de cadena con un objeto de cadena creado usando elString
constructor.Aquí el
==
operador está verificando los valores de los dos objetos y regresandotrue
, pero===
está viendo que no son del mismo tipo y regresanfalse
. ¿Cuál es el correcto? Eso realmente depende de lo que intentes comparar. Mi consejo es evitar la pregunta por completo y simplemente no usar elString
constructor para crear objetos de cadena a partir de literales de cadena.Referencia
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
fuente
Usando el
==
operador ( Igualdad )Usando el
===
operador ( Identidad )Esto se debe a que el operador de igualdad
==
escribe la coerción , lo que significa que el intérprete intenta implícitamente convertir los valores antes de comparar.Por otro lado, el operador de identidad
===
no realiza la coerción de tipo y, por lo tanto, no convierte los valores al comparar y, por lo tanto, es más rápido (según esta prueba de referencia JS ) ya que omite un paso.fuente
==
"igualdad abstracta" y se llama===
"igualdad estricta". Por supuesto, llamar a==
cualquier tipo de "igualdad" es IMHO horrible, ya que no es transitivo, pero ¿por qué objetar? Aunque tomo más problemas con la "identidad"; Creo que ese término es bastante engañoso, aunque "funciona". Pero en serio, ¿quién acuñó el término "identidad"? Busqué el estándar y no pude encontrarlo.Una interesante representación pictórica de la comparación de igualdad entre
==
y===
.Fuente: http://dorey.github.io/JavaScript-Equality-Table/
var1 === var2
var1 == var2
fuente
x == null
con seguridad para verificar six
esnull
oundefined
.==
frente===
. Las mayúsculas y minúsculas son desiguales de todos modos, y volveránfalse
con ambos==
y===
operadores. Además, las palabras clavetrue
,false
,undefined
,null
,Infinity
existen en JS sólo en un caso, y no se pueden utilizar en los casos superiores o mixtos.En las respuestas aquí, no leí nada sobre lo que significa igualdad . Algunos dirán que
===
significa igual y del mismo tipo , pero eso no es realmente cierto. En realidad, significa que ambos operandos hacen referencia al mismo objeto , o en el caso de tipos de valor, tienen el mismo valor .Entonces, tomemos el siguiente código:
Lo mismo aquí:
O incluso:
Este comportamiento no siempre es obvio. Hay más en la historia que ser igual y ser del mismo tipo.
La regla es:
Para los tipos de valor (números):
a === b
devuelve verdadero sia
yb
tiene el mismo valor y son del mismo tipoPara tipos de referencia:
a === b
devuelve verdadero sia
y haceb
referencia al mismo objeto exactoPara cadenas:
a === b
devuelve verdadero sia
yb
son ambas cadenas y contienen exactamente los mismos caracteresCuerdas: el caso especial ...
Las cadenas no son tipos de valor, pero en Javascript se comportan como tipos de valor, por lo que serán "iguales" cuando los caracteres en la cadena son iguales y cuando tienen la misma longitud (como se explica en la tercera regla)
Ahora se vuelve interesante:
Pero ¿qué tal esto ?:
¿Pensé que las cadenas se comportan como tipos de valor? Bueno, depende de a quién le pregunte ... En este caso, ayb no son del mismo tipo.
a
es de tipoObject
, mientras queb
es de tipostring
. Solo recuerde que crear un objeto de cadena usando elString
constructor crea algo de tipoObject
que se comporta como una cadena la mayor parte del tiempo .fuente
new Number() == "0"
. También en Firefox:(function(){}) == "function () {\n}"
new String("123") !== "123"
. Son de diferentes tipos. Simple, pero confuso.String
Los objetos se comportan como cadenas como cualquier otro objeto .new String
nunca debe usarse, ya que eso no crea cadenas reales. Una cadena real y puede hacerse con literales de cadena o llamandoString
como una función sinnew
, por ejemplo:String(0); //"0", Real string, not an object
Déjame agregar este consejo:
En caso de duda, lea la especificación !
ECMA-262 es la especificación para un lenguaje de script del cual JavaScript es un dialecto. Por supuesto, en la práctica, importa más cómo se comportan los navegadores más importantes que una definición esotérica de cómo se supone que se debe manejar algo. Pero es útil comprender por qué la nueva Cadena ("a")! == "a" .
Permítanme explicar cómo leer la especificación para aclarar esta pregunta. Veo que en este tema tan antiguo nadie tenía una respuesta para el efecto muy extraño. Entonces, si puede leer una especificación, esto lo ayudará enormemente en su profesión. Es una habilidad adquirida. Entonces, continuemos.
Buscar en el archivo PDF === me lleva a la página 56 de la especificación: 11.9.4. El operador estricto igual (===) , y después de leer las especificaciones, encuentro:
Interesante es el paso 11. Sí, las cadenas se tratan como tipos de valor. Pero esto no explica por qué nueva cadena ("a")! == "a" . ¿Tenemos un navegador que no cumple con ECMA-262?
¡No tan rapido!
Verifiquemos los tipos de los operandos. Pruébelo usted mismo envolviéndolos en typeof () . Encuentro que la nueva Cadena ("a") es un objeto, y se utiliza el paso 1: devuelve falso si los tipos son diferentes.
Si se pregunta por qué la nueva Cadena ("a") no devuelve una cadena, ¿qué tal un poco de ejercicio leyendo una especificación? ¡Que te diviertas!
Aidiakapi escribió esto en un comentario a continuación:
new siempre devuelve un Object, incluso para los constructores de cadenas . Y por desgracia! La semántica de valor para cadenas (consulte el paso 11) se pierde.
Y esto finalmente significa: nueva cadena ("a")! == "a" .
fuente
new String('x')
, porque nunca he visto ningún código en la naturaleza que use objetos de envoltura primitivos, y no creo que haya muchas buenas razones para hacerlo, especialmente en estos días. ¿Alguna vez has encontrado código que lo haga?new String()
.new String()
es probablemente la menor de tus preocupaciones. Entiendo la preocupación en teoría, pero de nuevo, ¿tienes algún ejemplo del mundo real? Para mí es como la vieja ansiedad que alguien podría establecerundefined
a otro valor.En PHP y JavaScript, es un operador de igualdad estricto. Lo que significa que comparará tanto el tipo como los valores.
fuente
var a = {}, b = {};
a == b
devuelve falso.var a = {}, b = {};
Mientras ambosa
y deb
hecho son un objeto, pero técnicamente no tienen el mismo valor. Son instancias diferentes . Tenga en cuenta que comparar instancias se comporta de manera diferente que comparar primitivas. Lo que probablemente se suma a esta confusión. Verá un comportamiento de comparación similar si utiliza la versión de instancia de tipos de datos primitivos. Por ejemplonew String('asdf')
onew Number(5)
. Ej:new Number(5) == new Number(5)
es falso, aunque tengan el mismo valor.Probé esto en Firefox con Firebug usando un código como este:
y
Mis resultados (probados cinco veces cada uno y promediados):
Entonces diría que la minúscula diferencia (esto es más de 100000 iteraciones, recuerde) es insignificante. El rendimiento no es una razón para hacerlo
===
. Escriba seguridad (bueno, tan seguro como va a obtener en JavaScript), y la calidad del código es.fuente
==
no está de acuerdo.==
operador? Recuerde, eso es cuando hay un aumento de rendimiento.===
más,==
pero te equivocas en que su rendimiento es esencialmente igual y que crees que esta prueba demuestra que, y que muchas otras personas estuvieron de acuerdo, es totalmente absurdo para mí.En JavaScript significa del mismo valor y tipo.
Por ejemplo,
pero
fuente
El === operador se llama un operador de comparación estricta, que no difiere de la == operador.
Tomemos 2 vars a y b.
Para que "a == b" se evalúe como verdadero a y b deben tener el mismo valor .
En el caso de "a === b", a y b deben tener el mismo valor y también el mismo tipo para que se evalúe como verdadero.
Toma el siguiente ejemplo
En resumen ; el uso del operador == podría evaluar como verdadero en situaciones en las que no lo desee, por lo que usar el operador === sería más seguro.
En el escenario de uso del 90%, no importa cuál use, pero es útil saber la diferencia cuando algún día tiene un comportamiento inesperado.
fuente
¿Por qué
==
es tan impredecible?¿Qué obtienes cuando comparas una cadena vacía
""
con el número cero0
?true
Sí, eso es correcto según
==
una cadena vacía y el número cero es al mismo tiempo.Y no termina ahí, aquí hay otro:
Las cosas se ponen realmente extrañas con los arreglos.
Luego más raro con cuerdas
Se pone peor:
¿Cuándo es igual no igual?
Déjame decirlo de nuevo:
Y esto es solo lo loco que obtienes con los primitivos.
Es un nivel completamente nuevo de locura cuando lo usas
==
con objetos.En este punto, probablemente te estés preguntando ...
¿Por qué pasó esto?
Bueno, es porque a diferencia de "triple igual" (
===
), que solo comprueba si dos valores son iguales.==
hace un montón de otras cosas .Tiene un manejo especial para funciones, manejo especial para nulos, indefinidos, cadenas, lo que sea.
Se pone bastante loco.
De hecho, si intentas escribir una función que haga lo que
==
hace, se vería así:Entonces, ¿qué significa esto?
Significa
==
es complicado.Debido a que es complicado, es difícil saber qué sucederá cuando lo use.
Lo que significa que podrías terminar con errores.
Entonces la moraleja de la historia es ...
Haz tu vida menos complicada.
Usar en
===
lugar de==
.El fin.
fuente
looseEqual
está equivocado.Function == Function.toString()
Es cierto, perolooseEqual(Function, Function.toString())
es falso. No estoy seguro de por qué filtra las funciones al principio.typeof x === "object"
verificar si es un objeto, pero `typeof solo funciona para primitivas no nulas. Puede que le interese mi lista de formas adecuadas de verificar si un valor es un objeto(function blah() { console.log("test"); }) != {valueOf:function(){return "function blah() { console.log(\"test\"); }";}}
echa un vistazo a este JS Fiddle que ejecuta todas las pruebas: jsfiddle.net/luisperezphd/7k6gcn6g (hay 1,225 permutaciones de prueba)==
hace muchas cosas, lo que hace que sea muy difícil anticipar los resultados, mientras que===
es mucho más directo y predecible, que es una de las razones principales por===
la que se recomienda la elección. (Agregaré una nota a la respuesta mencionando su punto)===
comprueba que los mismos lados son iguales en tipo y valor .Ejemplo:
Ejemplo común:
Otro ejemplo común:
Muchas veces un sin tipo de verificación sería práctico porque no le importa si el valor es
undefined
,null
,0
o""
fuente
'string' !== 'number'
Diagrama de flujo de ejecución de Javascript para igualdad estricta / Comparación '==='
Diagrama de flujo de ejecución de Javascript para igualdad / comparación no estricta '=='
fuente
string
flecha apunta a la gran caja gris, ¿se supone que significa que el interruptor está lanzando la cadena a un número?string
se supone que se compara con un tiponumber
, por lo que el interruptor mira con qué se debe comparar la cadena y la convierte en consecuencia.ToNumber
que volvería cuando se le den diferentes tipos, por lo que si se le da una cadena, solo elegirá la última opción (y la convertirá en un número).==
utilizaToNumber
solo en los casosstring == number
oboolean == anything
superior (y solo enstring
/boolean
). Esto significa==
que nunca se convertiráundefined
onull
aunque estén en el cuadro gris. (Para cualquier combinación de cualquieraundefined
onull
o ambos,==
siempre devolverátrue
También, si un valor está en el lado izquierdo o derecho, no importa,.==
(Y===
) devolverá el mismo resultado.)JavaScript
===
vs==
.fuente
Significa igualdad sin coerción de tipo coerción de tipo significa que JavaScript no convierte automáticamente ningún otro tipo de datos a tipos de datos de cadena
fuente
En un guión típico no habrá diferencia de rendimiento. Más importante puede ser el hecho de que mil "===" pesa 1 KB más que mil "==" :) analizadores de JavaScript pueden decirle si hay una diferencia de rendimiento en su caso.
Pero personalmente haría lo que sugiere JSLint. Esta recomendación no existe debido a problemas de rendimiento, sino porque los medios de coerción de tipo
('\t\r\n' == 0)
son ciertos.fuente
El operador de comparación igual == es confuso y debe evitarse.
Si TIENES QUE vivir con eso, recuerda las siguientes 3 cosas:
TABLA DE VERDAD DEL OPERADOR IGUAL EN JAVASCRIPT
** EXTRAÑO: tenga en cuenta que cualquiera de los dos valores en la primera columna no son iguales en ese sentido. **
fuente
Es poco probable que haya alguna diferencia de rendimiento entre las dos operaciones en su uso. No hay conversión de tipo para hacer porque ambos parámetros ya son del mismo tipo. Ambas operaciones tendrán una comparación de tipos seguida de una comparación de valores.
fuente
¡Si! Si importa.
===
El operador en javascript verifica el valor y el tipo donde el==
operador solo verifica el valor (escribe conversión si es necesario) .Puedes probarlo fácilmente. Pegue el siguiente código en un archivo HTML y ábralo en el navegador
Obtendrá ' falso ' en alerta. Ahora modifique el
onPageLoad()
método paraalert(x == 5);
que se vuelva verdadero .fuente
===
El operador comprueba los valores, así como los tipos de variables para la igualdad.==
El operador solo comprueba el valor de las variables para la igualdad.fuente
Es una prueba de verificación estricta.
Es algo bueno, especialmente si está comprobando entre 0 y falso y nulo.
Por ejemplo, si tienes:
Entonces:
Todo vuelve verdadero y es posible que no desee esto. Supongamos que tiene una función que puede devolver el índice 0 de una matriz o falso en caso de falla. Si marca con "==" falso, puede obtener un resultado confuso.
Entonces, con lo mismo que el anterior, pero una prueba estricta:
fuente
0 != null
. -1JSLint a veces te da razones poco realistas para modificar cosas.
===
tiene exactamente el mismo rendimiento que==
si los tipos ya fueran iguales.Es más rápido solo cuando los tipos no son iguales, en cuyo caso no intenta convertir los tipos sino que devuelve directamente un falso.
Entonces, en mi humilde opinión, JSLint puede usarse para escribir código nuevo, pero se debe evitar a toda costa la optimización excesiva inútil.
Es decir, no hay ninguna razón para cambiar
==
a===
un cheque comoif (a == 'test')
cuando se sabe que es un hecho que una única puede ser una cadena.Modificar una gran cantidad de código de esa manera desperdicia el tiempo de los desarrolladores y revisores y no logra nada.
fuente
Simplemente
==
significa comparación entre operandos contype conversion
Y
===
significa comparación entre operandos sintype conversion
La conversión de tipos en javaScript significa que javaScript convierte automáticamente cualquier otro tipo de datos a tipos de datos de cadena.
Por ejemplo:
fuente
Un ejemplo simple es
fuente
Las 2 respuestas principales mencionadas son == significa igualdad y === significa identidad. Lamentablemente, esta afirmación es incorrecta.
Si ambos operandos de == son objetos, entonces se comparan para ver si son el mismo objeto. Si ambos operandos apuntan al mismo objeto, el operador igual devuelve verdadero. De lo contrario, los dos no son iguales.
En el código anterior, ambos == y === se vuelven falsos porque a y b no son los mismos objetos.
Es decir: si ambos operandos de == son objetos, == se comporta igual que ===, lo que también significa identidad. La diferencia esencial de estos dos operadores es sobre la conversión de tipos. == tiene conversión antes de verificar la igualdad, pero === no.
fuente
Como regla general, generalmente usaría en
===
lugar de==
(y en!==
lugar de!=
).Las razones se explican en las respuestas anteriores y también Douglas Crockford lo tiene bastante claro ( JavaScript: The Good Parts ).
Sin embargo, hay una única excepción :
== null
es una forma eficiente de verificar si 'es nulo o indefinido':Por ejemplo, jQuery 1.9.1 usa este patrón 43 veces, y el verificador de sintaxis JSHint incluso proporciona la
eqnull
opción relajante por este motivo.De la guía de estilo jQuery :
fuente
El problema es que podrías meterte fácilmente en problemas ya que JavaScript tiene muchas conversiones implícitas, lo que significa ...
Que muy pronto se convierte en un problema. La mejor muestra de por qué la conversión implícita es "malvada" se puede tomar de este código en MFC / C ++ que en realidad se compilará debido a una conversión implícita de CString a HANDLE, que es un tipo de tipo puntero de definición ...
Lo que obviamente durante el tiempo de ejecución hace muy cosas indefinidas ...
Google para conversiones implícitas en C ++ y STL para obtener algunos de los argumentos en su contra ...
fuente
0 == null
Es falso.Desde la referencia central de JavaScript
fuente
Comparación de igualdad:
Operador
==
Devuelve verdadero, cuando ambos operandos son iguales. Los operandos se convierten al mismo tipo antes de ser comparados.
Igualdad y comparación de tipos:
Operador
===
Devuelve verdadero si ambos operandos son iguales y del mismo tipo. En general, es mejor y más seguro si se compara de esta manera, porque no hay conversiones de tipo detrás de escena.
fuente
Aquí hay una práctica tabla de comparación que muestra las conversiones que ocurren y las diferencias entre
==
y===
.Como dice la conclusión:
http://dorey.github.io/JavaScript-Equality-Table/
fuente
nulo e indefinido son la nada, es decir,
Aquí
a
yb
no tienen valores. Mientras que 0, falso y '' son todos valores. Una cosa común entre todos estos es que todos son valores falsos, lo que significa que todos satisfacen condiciones falsas.Entonces, el 0, falso y '' juntos forman un subgrupo. Y por otro lado, nulo e indefinido forman el segundo subgrupo. Verifique las comparaciones en la imagen de abajo. nulo e indefinido sería igual. Los otros tres serían iguales entre sí. Pero, todos se tratan como condiciones falsas en JavaScript.
Esto es lo mismo que cualquier objeto (como {}, matrices, etc.), una cadena no vacía y un valor booleano verdadero son todas condiciones verdaderas. Pero, no todos son iguales.
fuente