2010-07-28 13 views
15

Estaba revisando JSLint, y algunas de las reglas despertaron mi interés. Particularmente esto:¿Por qué es una mala idea permitir esto en JavaScript ==,! =, ++, -

No permitir == y =

No permitir ++ y -

¿Por qué es una mala idea para no permitir estos!? Entiendo la primera parte, básicamente quiere que haga === en lugar de ==. No entiendo por qué embargo. Entiendo la diferencia entre los dos, solo quiero saber por qué es una mala práctica. Algunas veces realmente quiero hacer == por ejemplo para que se evalúe verdadero para undefined == null

El segundo, bueno, no entiendo en absoluto. ¿Quiere que haga myInt + = 1 en lugar de myInt ++?

Gracias!

+1

Después de leer las respuestas de todos, ahora entiendo por qué el lema de JSLint es "JSLint lastimar sus sentimientos." – 7wp

+0

Ver [¿Por qué evitar los operadores de incremento ("++") y decremento ("-") en JavaScript?] (Http://stackoverflow.com/questions/971312/why-avoid-increment-and-decrement-operators- in-javascript) –

+0

@Matthew, ¿por qué votó para cerrar mi pregunta? El otro que vinculó no aborda mi pregunta sobre == y! = (Aunque sí habla sobre el ++ y -) – 7wp

Respuesta

4

Douglas Crockford (el tipo que escribió JSLint) explica a sí mismo en este video:

http://www.youtube.com/watch?v=hQVTIJBZook#t=14m45s

pero en el fondo (como todos los demás han mencionado) que es debido a la coercian tipo.

Merece la pena ver quién es honesto, muy interesante y útil.

+0

Gracias por el enlace, lo veré. – 7wp

+0

Ese video fue útil, explica mucho. Ahora estoy interesado en leer su libro también. – 7wp

+0

¡Me alegro de escucharlo! :) Su libro también es muy bueno, ¡probablemente el mejor texto de JavaScript que existe! Como se puede imaginar, se expande enormemente en el contenido del video. No se deje engañar por su mera ~ 150 páginas. Probablemente el libro técnico más densamente empaquetado que he leído. La página para la página es una ganga. P.S. - No recibo comisión por esto;) – lucas1000001

10

Doug Crockford tiene sus propias ideas sobre lo que es "bueno" y "malo" en Javascript. En consecuencia, JSLint implementa estos controles, pero los hace opcionales si no está completamente de acuerdo con él.

No permitir == le ayuda a evitar que cometa errores cuando realmente quiso decir ===. Por supuesto, esto supone que en realidad nunca desea utilizar ==.

No permitir ++ y -- es una cosa de estilo, algunas personas creen que son difíciles de leer que += 1 y -= 1.

+2

Derecha ... Creo que lo que quiero saber es por qué consideraría esos 'buenos', incluso si no estoy de acuerdo con ellos. Solo quiero saber su punto de vista. – 7wp

+9

Recomiendo leer [Javascript: The Good Parts] (http://books.google.co.nz/books?id=PXa2bby0oQ0C) para obtener todos los detalles sobre el punto de vista de Crockford. –

3

Desde el instructions:

El == y = operadores lo escriba antes de comparar la coacción. Esto es malo porque hace que '\ t \ r \ n' == 0 sea verdadero. Esto puede enmascarar errores de tipo.

y

La ++ (incremento) y - (decremento) Los operadores han sido conocidos por contribuir al mal código mediante el fomento de astucia excesiva. Solo superan a la arquitectura defectuosa al permitir virus y otras amenazas de seguridad. Existe una opción plusplus que prohíbe el uso de estos operadores.

12

No estoy de acuerdo demasiado con esas reglas, en lugar de desalentar el uso de ==, recomendaría a aprender sobre el tipo de coacción.

La razón principal de por qué Crockford quiere evitar == es que las reglas de comparación en función de los tipos de los operandos pueden hacer que este operador no transitiva, por ejemplo, si:

A == B AND 
B == C 

Doesn' t garantiza que:

A == C 

Un ejemplo real:

'0' == 0; // true 
0 == ''; // true 
'0' == ''; // false 

La estricta === operador no es realmente necesario cuando se comparan los valores del mismo tipo, por ejemplo:

if (typeof foo == "function") { } 

Se compara el resultado del operador typeof, que es siempre una cadena, con una cadena literal ...

Otro ejemplo, cuando se compara algo en contra de null, == compara también contra undefined, por ejemplo:

if (something == null) {} 

VS

if (something === null || typeof something === "undefined") {} 

Las dos condiciones anteriores son equivalentes en el final, pero el primero mucho más legible, por supuesto, si usted sabe sobre el tipo de coacción y cómo se comporta ==.

Conocer cómo funciona el operador ==, lo ayudará a decidir qué usar.

artículos recomendados:

+0

Creo que '0' == 0 evaluar para verdadero tiene sentido para mí, y me da flexibilidad que me permite escribir menos código. – 7wp

+0

analogía: sé todo sobre tipeo estático, pero todavía quiero que mi compilador lo haga cumplir por mí. –

+0

@ 7wp: Un problema con las comparaciones de tipo mixto es que 'someNumber == someString' no indica si el programador se preocupa por lo que sucede si los diferentes métodos de evaluación arrojarían resultados diferentes, o esperaría que los operandos siempre sean tales que todos los métodos de evaluación arrojarían el mismo resultado. En mi humilde opinión, un buen lenguaje solo debería permitir tales comparaciones en los casos en que no haya ambigüedad y donde se mantenga la transitividad. – supercat

0

entiendo ==. (Lo undefined == null es una excepción)

("0" == false) === true 
("0" === false) === false 

nunca he entendido lo ++ y -- sin embargo. No me gusta hacer i+=1 en todo mi código (es más lento que ++i).

+1

'--x +++ x-x ++'. Contráctido, pero mi único argumento contra '++' y '--'. :) –

+0

jaja. eso ni siquiera es válido. :-) –

+0

Pero esto es: '--x + ++ x-x ++' (solo se agrega un espacio), y es casi tan malo –

2

Los operadores == y != hacen la conversión implícita de los operadores si es necesario, mientras que los operadores === y !== no lo hacen. La expresión 4 == '4' por ejemplo será verdadera, mientras que la expresión 4 === '4' será falsa.

Preferiblemente, debe conocer los tipos de datos con los que está tratando para poder hacer las comparaciones adecuadas en el código.

El ++ y -- operadores no causa ningún problema si se usan solos en un comunicado, pero a menudo se utilizan para hacer una declaración que hace más de una cosa de una manera no tan obvio, como:

arr[++idx] = 42; 

que sería más clara como:

idx += 1; 
arr[idx] = 42; 
Cuestiones relacionadas