2010-12-31 11 views
10

Por lo que sé en JavaScript !! se supone que normaliza un valor booleano convirtiéndolo en verdadero o falso de algún otro tipo. Esto significa que el "0" se convierte en booleano verdadero. Por otro lado, si lo comparo con falso, resulta que de hecho es falso (ya que el resultado de la comparación es verdadero). ¿Qué regla me falta aquí? Lo he probado en IE y Opera.¿Por qué la alerta (!! "0") y la alerta (falsa == "0") salen verdaderas en JavaScript

+0

posible duplicado de [Diferencia entre Boolan (! X) y Boolean (x == 0)?] (Http://stackoverflow.com/questions/4280344/difference-between-boolanx-and-booleanx-0/4280356 # 4280356) – SLaks

Respuesta

10

El operador == comprueba la igualdad suelta, que no tiene nada que ver con la veracidad.

Específicamente, convertirá a operandos en números y luego comparará los números.
Las cadenas que contienen números se convierten a los números que contienen; booleanos se convierten a 0 y 1.
Los objetos se convierten llamando al valueOf, si está definido.

Por lo tanto, todos los siguientes son verdaderas:

  • "1" == 1
  • "0" == false
  • "1" == true
  • "2" != true
  • "2" != false
  • ({ valueOf:function() { return 2; } }) == 2
  • ({ valueOf:function() { return 1; } }) == true
+3

de hecho, o en resumen, "esta mierda es wack" – Claudiu

9

En el primer caso, una cadena no vacía es equivalente a verdadero.

En el segundo caso, como un operando es booleano, ambos operandos se convierten a valores numéricos. Creo que false se convierte al valor numérico 0 y la cadena "0" también se convierte en 0, lo que da como resultado 0 == 0 que es verdadero.

Consulte el Mozilla reference para conocer el comportamiento del operador.

+0

Gracias por el comentario sobre mi respuesta, eso tiene mucho sentido. ¡Buena atrapada! +1 para usted, buen señor. – wsanville

2

Para la primera expresión, sección 9.2 de ECMA-262 define una ToBoolean operación abstracta usado internamente por el operador lógico NOT. Dice:

Cadena
El resultado es falso si el argumento es la cadena vacía (su longitud es cero); de lo contrario, el resultado es verdadero.

Para la segunda expresión, JavaScript realizará una coerción de tipo cuando intente comparar estos valores de diferentes tipos de datos. Douglas Crockford dice que this is a misfeature. Sería falso si hubiera usado === en lugar de ==. Las reglas son bastante complejas, por lo que debe consultar directamente en la sección 11.9.3 de ECMA-262 los detalles.