Lo siguiente muestra que "0"
es falso en Javascript:
>>> "0" == false
true
>>> false == "0"
true
Entonces, ¿por qué se imprime lo siguiente "ha"
?
>>> if ("0") console.log("ha")
ha
javascript
boolean
nonopolaridad
fuente
fuente
"0"
es una cadena y, como no está vacía, se evalúa como verdadera."0" === false [...] false
'0'==false
pero '0' no es un valor de falsey (sí, Javascript puede ser extraño)==
, nunca se convierten en booleanos, por lo que no se aplica. (Las reglas para la conversión parecen favorecer la conversión a números)Respuestas:
La razón es porque cuando lo haces explícitamente
"0" == false
, ambos lados se convierten en números, y luego se realiza la comparación.Cuando lo hace:,
if ("0") console.log("ha")
el valor de la cadena se está probando. Cualquier cadena no vacía estrue
, mientras que una cadena vacía esfalse
.fuente
Tablas que muestran el problema:
y ==
Moraleja del uso de la historia ===
crédito de generación de tablas: https://github.com/dorey/JavaScript-Equality-Table
fuente
NaN
sin embargo. Quiero decir,typeof NaN // number
peroNaN === NaN // false
, hmm ...NaN
, por lo que cuando se comparan 2 NaN, son de valores diferentes (supongo). Lea la primera cita aquí .==
tampoco===
operador para el[]
,{}
,[[]]
,[0]
y[1]
los valores no evalúan a verdadero. Quiero decir[] == []
y[] === []
también falso.Es de acuerdo a las especificaciones.
ToBoolean, según las especificaciones, es
Y esa tabla dice esto sobre cadenas:
Ahora, para explicar por
"0" == false
qué debería leer el operador de igualdad, que establece que su valor de la operación abstractaGetValue(lref)
coincide con el lado derecho.Que describe esta parte relevante como:
O, en otras palabras, una cadena tiene una base primitiva, que vuelve a llamar al método interno get y termina pareciendo falso.
Si desea evaluar las cosas usando la operación GetValue use
==
, si desea evaluar usando elToBoolean
uso,===
(también conocido como el operador de igualdad "estricto")fuente
"a string has a primitive base, which calls back the internal get method and ends up looking false"
¿Es esto cierto para todas las cadenas?Section 8.12.3: [[Get]] (P)
describe cómo funciona. Es cierto solo para los casos en que la cadena es 0, ya que hace un montón de otras llamadas internas que finalmente resultan enGetOwnProperty
que "lo que sea" es una propiedad de datos, que luego devuelve todo ese valor. Es por eso que "0" es falso y "bla" es verdadero. Echa un vistazo a algunos de los videos de Douglas Crockford en el teatro de desarrolladores de Yahoo, él describe la "verdad" en JavaScript un poco menos complejo que yo. Si comprende lo que significa "verdad" y "falsedad", comprenderá la respuesta de Bobince de inmediato.Es PHP donde la cadena
"0"
es falsa (false-when-used-in-boolean-context). En JavaScript, todas las cadenas no vacías son verdaderas.El truco es que
==
contra un valor booleano no se evalúa en un contexto booleano, se convierte en número, y en el caso de cadenas que se realiza analizando como decimal. Entonces obtienes Number en0
lugar de la verdad booleanatrue
.Este es un diseño de lenguaje realmente pobre y es una de las razones por las que tratamos de no utilizar el desafortunado
==
operador. Usar en su===
lugar.fuente
fuente
Sus comillas alrededor lo
0
convierten en una cadena, que se evalúa como verdadera.Elimine las comillas y debería funcionar.
fuente
Todo se debe a las especificaciones de ECMA ...
"0" == false
debido a las reglas especificadas aquí http://ecma262-5.com/ELS5_HTML.htm#Section_11.9.3 ... Y seif ('0')
evalúa como verdadero debido a las reglas especificadas aquí http: / /ecma262-5.com/ELS5_HTML.htm#Section_12.5fuente
La expresión "if" prueba la veracidad, mientras que la prueba de doble igualdad para la equivalencia independiente del tipo. Una cadena siempre es verdadera, como han señalado otros aquí. Si el doble igual probara la veracidad de sus dos operandos y luego comparara los resultados, obtendría el resultado que suponía intuitivamente, es decir
("0" == true) === true
. Como dice Doug Crockford en su excelente JavaScript: las partes buenas , "las reglas por las cuales [== coacciona los tipos de sus operandos] son complicadas e inmemorables ... La falta de transitividad es alarmante". Es suficiente decir que uno de los operandos está forzado para coincidir con el otro, y que "0" termina siendo interpretado como un cero numérico,fuente
== El operador de igualdad evalúa los argumentos después de convertirlos a números. Entonces la cadena cero "0" se convierte al tipo de datos Number y boolean false se convierte al Número 0. Entonces
Lo mismo se aplica a `
=== La estricta verificación de igualdad evalúa los argumentos con el tipo de datos original
Lo mismo se aplica a
En
La cadena "0" no se compara con ningún argumento, y la cadena es un valor verdadero hasta que, o a menos que se compare con algún argumento. Es exactamente como
Pero
``
fuente
Esto se debe a que JavaScript usa la coerción de tipo en contextos booleanos y su código
será forzado a verdadero en contextos booleanos.
Hay otros valores de verdad en Javascript que se convertirán en verdaderos en contextos booleanos y, por lo tanto, ejecutarán el bloque if:
fuente
coacciona x usando toBoolean interno de JavaScript (http://es5.github.com/#x9.2)
coacciona a ambos lados usando la coerción interna toNumber (http://es5.github.com/#x9.3) o toPrimitive para objetos (http://es5.github.com/#x9.1)
Para más detalles ver http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/
fuente