2009-10-23 14 views
5

Siempre pensé que una sentencia if esencialmente comparaba su argumento similar a == true. Sin embargo, el siguiente experimento en Firebug confirmó mis peores temores después de escribir Javascript durante 15 años sigo sin tener ni idea de WTF está pasando:¿Cuál es la semántica de Javascripts If Statement

>>> " " == true 
false 
>>> if(" ") console.log("wtf") 
wtf 

Mi visión del mundo está en ruinas aquí. Podría hacer algunos experimentos para obtener más información, pero incluso así estaría perdiendo el sueño por temor a los caprichos del navegador. ¿Esto está en alguna especificación? ¿Es coherente entre navegadores? ¿Alguna vez dominaré javascript?

+0

extraño, tengo curiosidad por ver las respuestas – theraccoonbear

Respuesta

7

"Si los dos operandos no son del mismo tipo, JavaScript convierte los operandos y luego aplica la comparación estricta. Si cualquiera de los operandos es un número o un booleano, los operandos se convierten en números, si cualquiera de los operandos es una cadena, otro se convierte en una cadena."

https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Comparison_Operators

Así que la primera se hace:

Number(" ")==Number(true) 

mientras que el segundo se evalúa del siguiente modo:

if(Boolean(" ")==true) console.log("wtf") 
+0

Esta es la explicación más sensata. La instrucción if arroja a Boolean. Puntos de bonificación si alguien puede encontrar una especificación para este comportamiento. – gtd

+1

Bueno, los documentos de Mozilla tienen lo siguiente que decir acerca de la conversión que tiene lugar en la declaración if: "Cualquier valor que no esté indefinido, nulo, 0, NaN o la cadena vacía (" ") y cualquier objeto, incluido un El objeto booleano cuyo valor es falso, se evalúa como verdadero cuando se pasa a una instrucción condicional. " – kloffy

+0

Y esto con respecto a la conversión utilizando Boolean (valor): "Si el valor se omite o es 0, -0, nulo, falso, NaN, indefinido o la cadena vacía (" "), el objeto tiene un valor inicial de falso. " – kloffy

3

Supongo que es la primera parte que es un problema, no la segunda.

Probablemente hace algo de fundición raro (lo más probable, es echado true a una cadena en lugar de " " de ser echado a un valor booleano.

Lo que hace FireBug cambio de Boolean(" ")?

+0

Mi primera reacción fue esta, creo que tienes razón. – Jonas

+0

Bueno, las guerras santas se han perpetuado simplemente por la definición de veracidad en los lenguajes de programación, pero en javascript simplemente asumí que, dado que == no funciona y === es una coincidencia exacta, == cierto sería la definición natural de veracidad. – gtd

+0

Boolean ("") => verdadero booleano ("") => falso – gtd

0

recomiendo el uso de == = siempre que sea posible, aunque sólo sea para evitar que las crisis existenciales.

+0

Esto es pura tontería. String.prototype.f = function() {return this}; "foo" .f() === "foo" // ¿cuál es el resultado? La identidad es identidad Es un caso especial, no el caso normal. –

3

JavaScript puede ser peculiar con este tipo de cosas. tenga en cuenta que Javascript == sino también ===. yo hubiera pensado que

" " == true 

habría true, pero

" " === true 

habría false. El operador === no realiza conversiones; comprueba si el valor y el tipo en ambos lados del operador son los mismos. El == convierte los valores 'verdaderos' en verdaderos y 'falsos' en falsos.

Esta podría ser la respuesta - a partir JavaScript Comparison Operators (documentación de Mozilla):

igual (==)

Si los dos operandos no son del mismo tipo, JavaScript convierte los operandos a continuación, Aplica una comparación estricta. Si cualquiera de los operandos es un número o un booleano, los operandos se convierten en números; si cualquier operando es una cadena, el otro se convierte en una cadena

Altamente recomendado: Douglas Crockford on JavaScript.

+0

Buen enlace, tenía Javascript: las partes buenas, pero no sé a dónde se fue. – gtd

2

Respuesta: aTruthyValue y verdadero no son lo mismo.

La se mantic de la instrucción if es fácil:

if(aTruthyValue) { 
    doThis 
} else { 
    doThat 
} 

Ahora es solo la definición de lo que es un valor de verdad. Un valor de verdad es, lamentablemente, algo que simplemente es "== verdadero" o "=== verdadero".

ECMA-262 1.5 La sección 9.2 explica qué valores son verdaderos y cuáles no.

+1

+1 para la respuesta más directa, así como un enlace a la especificación * actual *! –

Cuestiones relacionadas