2012-08-27 35 views
15

Le estaba explicando a un colega que debe usar === y !== (y >== y <== por supuesto) al comparar variables en JavaScript para que no forzar los argumentos y obtener todo froopy y confuso pero me pidieron una parte pregunta que yo no sabía la respuesta a, y pensaba que iba a preguntar a los expertos aquí, específicamente es:igualdad de Javascript igualdad triple pero ¿qué hay de mayor que y menor que?

¿Qué hay de > y < - cuando comparan ¿también coaccionan a los argumentos o no - ¿por qué no es Hay algún tipo de operador de >> y << (probablemente tenga que ser de otra sintaxis, ya que supongo que serían operadores de cambio de bits si va a lo largo de todo el estilo C pero ¿entiendes la esencia?

Así que puedo escribir una prueba para encontrar la respuesta a la primera parte, lo que hice, aquí está:

// Demo the difference between == and === 
alert(5 == "5"); 
alert(5 === "5"); 

// Check out what happens with > 
alert(5 > "4");  
alert(5 > 4); 

y volvió:

true 
false 

true 
true 

lo que hace parece que el > está haciendo la coerción ya que > "4" y > 4 devuelven el mismo resultado. Entonces, ¿qué hay de la segunda parte ...

¿Existe algún tipo de operador para > y < que no fuerce el tipo (o cómo puedo cambiar mi prueba para realizar la prueba de manera segura)?

+3

En realidad no hay un '> ==' o '<==' en javascript por la misma razón que las respuestas descritas. Ver [operadores de comparación] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators) –

Respuesta

13

No, no hay necesidad de tales operadores. La comprobación de tipos realizada para esos operadores relacionales es diferente de la igualdad y la desigualdad. (edición — tal vez es un poco fuerte decir que "no hay necesidad", esto sólo es cierto porque JavaScript considera por lo :-)

En concreto, el > y < y >= y <= operadores todos funcionan bien en dos valores numéricos, o dos cadenas, que prefieren valores numéricos. Es decir, si un valor es un número, entonces el otro se trata como un número. Si un número no se puede convertir limpiamente a un número (es decir, si termina como NaN), el resultado de la comparación es undefined. (Eso es un poco problemático, porque undefined se verá como false en el contexto de una sentencia if.)

Si ambos valores son cadenas, a continuación, una comparación de cadenas de clasificación orden se lleva a cabo en su lugar.

Si lo piensas bien, estas comparaciones no tienen ningún sentido para las instancias de objetos; ¿Qué significa que un objeto sea "mayor que" otro? Supongo, quizás, que esto significa que si te encuentras con los valores de los tipos de variante comparados de esta manera, y eso está causando problemas, entonces sí tienes que detectar la situación tú mismo. Me parece que sería bueno trabajar río arriba y pensar si hay algo sospechoso en el código que conduce a tal situación.

+0

Agh, emoticlosing-parenthesicon ..! >. <(Pero +1 de todos modos.) –

+0

@DavidThomas lo siento pero eso es parte de mi persona "alegre participante SO" – Pointy

+0

'true> = 1' es cierto :(pero acepto que es menos problemático que el operador == – Alex

8

¿Hay algún tipo de operador para> < y que no coaccionar el tipo

No.

Cómo se puede cambiar mi prueba para realizar la prueba de forma segura

Usted tendría que probar de forma explícita los tipos:

typeof a === typeof b && a > b 
1

hice referencia JavaScript de Flanagan: La guía definitiva (5ª edición .) y no parece haber operadores de comparación no coercitivos.

Tiene razón al decir que < < y >> son de hecho operadores bit a bit, por lo que no funcionaría.

te sugeriría que deliberadamente coaccionar a los valores de ti mismo:

var num_as_string = '4'; 
var num = +num_as_string; 
if (5 > num) { ... } 
+0

What la sintaxis '+ ' significa en 'var num = + num_as_string;'? –

+1

@YatharthROCK: Es el operador unario plus y convierte un valor en un número: https://developer.mozilla.org/en-US/docs /JavaScript/Reference/Operators/Arithmetic_Operators#-_.28Unary_Negation.29 –

0
12 > '100' // false 
'12' > 100 // false 
'12' > '100' // true 

Como otros han dicho, si uno es un número que el otro está fundido en un número. La misma regla se aplica a estos casos, así:

null > 0 // false 
null < 0 // false 
null >= 0 // true 

Sin embargo, puede haber casos en los que usted necesita null >= 0 para dar false (o cualquiera de los casos de comparación de cadenas número de arriba), por lo que es de hecho una necesidad para tener una comparación estricta >== o <==.

Por ejemplo, estoy escribiendo un compareFunction para la Array.prototype.sort() y una expresión como x>=0 trataría null valores como 0 y ponerlos juntos, mientras que yo quiero ponerlos en otro lugar. Tengo que escribir lógica extra para esos casos.

Javascript dice que debe tratarlo solo (en la práctica).

Cuestiones relacionadas