Recientemente, estaba ejecutando parte de mi código a través de JSLint cuando se me ocurrió este error. Sin embargo, lo que creo que es gracioso acerca de este error es que automáticamente asume que todos == deberían ser ===.
¿Eso realmente tiene algún sentido? Pude ver muchos casos en los que no querría comparar el tipo y me preocupa que esto realmente pueda causar problemas.
La palabra "esperado" implicaría que esto debería hacerse CADA vez ..... Eso es lo que no tiene sentido para mí.
javascript
jslint
Metrópoli
fuente
fuente
myVar == null
verificación, sí, grandes cambios. ; ^) El argumento de Crockford es que hizo que el significado del código fuera más preciso, y eso es difícil de argumentar.Respuestas:
En mi opinión, usar ciegamente
===
, sin tratar de entender cómo funciona la conversión de tipos , no tiene mucho sentido.El temor principal sobre el operador Equals
==
es que las reglas de comparación que dependen de los tipos comparados pueden hacer que el operador no sea transitivo, por ejemplo, si:Realmente no garantiza que:
Por ejemplo:
'0' == 0; // true 0 == ''; // true '0' == ''; // false
El operador Strict Equals
===
no es realmente necesario cuando compara valores del mismo tipo, el ejemplo más común:if (typeof foo == "function") { //.. }
Comparamos el resultado del
typeof
operador, que siempre es una cadena , con un literal de cadena ...O cuando conozca las reglas de coerción de tipos, por ejemplo, verifique si algo es
null
oundefined
algo:if (foo == null) { // foo is null or undefined } // Vs. the following non-sense version: if (foo === null || typeof foo === "undefined") { // foo is null or undefined }
fuente
===
operador es la claridad del código. No existe una situación razonable para usar,==
ya que nunca será tan clara y comprensible como el operador de identidad. No se trata de si entiendes a los operadores o no, se trata de usar el que hace que tu código sea más fácil de leer sin costo alguno. Los únicos desarrolladores que se oponen al operador de identidad son los desarrolladores individuales y las personas que no trabajan en equipo. Por definición, las personas cuyo código no es revisado por suficientes ojos.there is no reasonable situation
es un error grave. Piense en los tipos de JavaScript (nativos)Number
yString
. Su existencia demuestra que los autores de Javascript tenían en mente ciertos casos de uso==
. ¿De verdad crees quenew String('hi') === 'hi'
evaluar afalse
es muy claro? Escriba un fragmento de código que pruebe el argumento de su función en contra de'hi'
aceptar tanto String como String y dígame que está claro.JSLint es inherentemente más defensivo de lo que permite la sintaxis de Javascript.
De la documentación de JSLint:
fuente
==
operador. El===
es un caso especial ... JSLint intenta hacer parecer que el uso de==
alguna manera sería mal ... Sin embargo, intente lo siguiente:var x = 4, y = new Number(4); if (x == y) {alert('Javascript depends on == just embrace it!');}
. Los tipos primitivos tienen clases correspondientes que los sustituyen (Number
,String
) y Javascript depende del==
operador para que compararlos sea natural.Tenga en cuenta que JSLint refuerza la idea de una persona de lo que debería ser un buen JavaScript. Aún debe usar el sentido común al implementar los cambios que sugiere.
En general, comparar el tipo y el valor hará que su código sea más seguro (no se encontrará con el comportamiento inesperado cuando la conversión de tipos no haga lo que usted cree que debería hacer).
fuente
Triple-igual es diferente a doble-igual porque además de verificar si los dos lados tienen el mismo valor, triple-igual también verifica que sean del mismo tipo de datos.
Entonces
("4" == 4)
es cierto, mientras que("4" === 4)
es falso.Triple-equal también se ejecuta un poco más rápido, porque JavaScript no tiene que perder tiempo haciendo conversiones de tipo antes de darle la respuesta.
JSLint tiene como objetivo deliberadamente hacer que su código JavaScript sea lo más estricto posible, con el objetivo de reducir errores oscuros. Destaca este tipo de cosas para intentar que codifique de una manera que lo obligue a respetar los tipos de datos.
Pero lo bueno de JSLint es que es solo una guía. Como dicen en el sitio, herirá tus sentimientos, incluso si eres un muy buen programador de JavaScript. Pero no debe sentirse obligado a seguir sus consejos. Si ha leído lo que tiene que decir y lo entiende, pero está seguro de que su código no se romperá, entonces no hay obligación de cambiar nada.
Incluso puede decirle a JSLint que ignore las categorías de comprobaciones si no quiere ser bombardeado con advertencias sobre las que no va a hacer nada.
fuente
Una cita de http://javascript.crockford.com/code.html :
JSLint es muy estricto, su 'webjslint.js' ni siquiera pasa su propia validación.
fuente
webjslint.js
no validar, aunque la mayoría de los errores que veo ahora tienen que ver con el espaciado. Claramente, uno debe usar el sentido común y el juicio razonable al revisar JavaScript usando JSLint.always
automáticamente descalifica esta cita como sabiduría. Los programadores inteligentes no son dogmáticos. Usan lo que es mejor en la situación dada. Y dan la bienvenida y adoptan cualquier herramienta integrada en el núcleo del lenguaje, no solo la descartan con unjust never touch it
. En pocas palabras: mi código es más corto (y no solo por guardar un=
carácter), por lo que mi sitio se carga más rápido, con un menor costo de ancho de banda, por lo que mi usuario está mejor atendido.Si quieres probar la falsedad. JSLint no permite
if (foo == null)
pero permite
if (!foo)
fuente
===
, que JSLint recomienda.foo == null
comprueba si es nulo o indefinido.!foo
comprueba si hay cadenas nulas, indefinidas, 0 y vacías.Para ayudar a explicar esta pregunta y también explicar por qué NetBeans (de) 7.3 ha comenzado a mostrar esta advertencia, este es un extracto de la respuesta en el rastreador de errores de NetBeans cuando alguien informó esto como un error:
Es una buena práctica utilizar === en lugar de == en JavaScript.
Referencia
fuente
Bueno, realmente no puede causar problemas, solo te está dando un consejo. Tómelo o déjelo. Dicho esto, no estoy seguro de lo inteligente que es. Bien puede haber contextos en los que no lo presente como un problema.
fuente