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
Respuesta
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
de hecho, o en resumen, "esta mierda es wack" – Claudiu
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.
Gracias por el comentario sobre mi respuesta, eso tiene mucho sentido. ¡Buena atrapada! +1 para usted, buen señor. – wsanville
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.
- 1. ¿Por qué "alerta (3> 2> 1)" alerta "falsa"
- 2. ¿Por qué es "0 === -0" verdadero en JavaScript?
- 3. ¿Por qué `null> = 0 && null <= 0` pero no` null == 0`?
- 4. ¿Por qué esta alerta 5?
- 5. JavaScript: Anulación de alerta()
- 6. ¿Por qué {} + [] devuelve 0 en Javascript?
- 7. ¿Por qué 0 && 1 es 1 mientras que 1 && 0 es 0 en ruby?
- 8. ¿Por qué es (Infinity | 0) === 0?
- 9. ¿Por qué 0 == "" verdadero en JavaScript
- 10. ¿Qué significa! 1 y! 0 en Javascript?
- 11. Alerta personalizada usando Javascript
- 12. Anular alerta y confirmar en Javascript
- 13. Enlace en alerta de Javascript
- 14. ¿Por qué el resultado 2 + 1 y 0 es 0?
- 15. ¿Qué margen: 5px 0; y margen: 5px 0 0; ¿media?
- 16. 0 + 0 + 0 ... + 0! = 0
- 17. Javascript - Cambiar icono de alerta
- 18. php 5 strpos() ¿diferencia entre devolver 0 y falsa?
- 19. ¿Por qué la devolución 0 es opcional?
- 20. ¿Qué es decltype (0 + 0)?
- 21. javascript onclick alerta no funciona en cromo
- 22. Node.js Alerta produce bloqueo
- 23. ¿La alerta no aparece desde la vista web en android?
- 24. 0 en [1, 2] == cierto, ¿por qué?
- 25. Javascript alerta cajas no trabajando en Chrome
- 26. ¿Qué es la tecla 0
- 27. ¿Por qué falla Convert.ToBoolean ("0")?
- 28. ¿Por qué InverseFunction [0 &] @ 0 devuelve 33/10?
- 29. ¿Por qué Long.valueOf (0) .equals (Integer.valueOf (0)) false?
- 30. error en el uso de alerta en Javascript ('alerta' Propiedad del objeto no es una función)
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