quitar - tipos de datos en javascript ejemplos
Variables no definidas, valor== falso contra! Valor (4)
Tengo un problema con un código muy simple escrito en Javascript, ¿podría ayudarme por favor?
Esto es lo que creo que he entendido hasta ahora sobre javascript y variables:
- Un valor no definido se evalúa como falso en una operación booleana
- Al usar un operador == en una comparación, estás preguntando si dos valores son comparables independientemente de sus tipos
Encontré un archivo de ejercicios en un curso en línea e intenté hacerlo, pero no obtuve el mismo resultado esperado en la lección; el problema principal era que estaba comparando el valor con un "if value == false {...}" mientras que la solución estaba usando un "if! value {...}"
Así que decidí escribir un código muy corto para intentarlo por mí mismo, pero estoy obteniendo resultados mixtos. Aquí, en el siguiente ejemplo, esperaría que este código JS genere dos alertas idénticas ("foo es igual a falso"), pero en cambio, la primera instrucción if devuelve "foo IS NO es igual a falso", mientras que la segunda si se devuelve (como se esperaba) "foo es igual a falso".
Esto es lo que escribí:
var foo = undefined;
if (foo == false) {
alert("foo is equal to false");
} else {
alert("foo is not equal to false"); // Javascript executes this row
}
if (!foo) {
alert("foo is equal to false"); // Javascript executes this row
} else {
alert("foo is not equal to false");
}
AFAIK los dos IF deben hacer el mismo trabajo, y de hecho cuando lo probé reemplazando en la primera línea el valor "var foo = undefined;" con "var foo = 0;" funcionó como se esperaba, y 0 es otro valor que debe evaluarse como falso, o al menos esto es lo que recuerdo.
¿Podrías decirme que estoy haciendo mal?
Como regla general, encuentro que el resultado positivo es más fácil de analizar, casi como if(!foo)
un doble negativo, por lo que tiendo a darle la vuelta:
if (foo) {
alert("foo is something or boolean true");
} else {
alert("foo is null, undefined or boolean false");
}
En particular, tanto undefined
como null
no son verdaderos o falsos, pero javascript puede manejar un tipo de taquigrafía porque es dinámico.
Realmente la afirmación anterior es algo como:
if (foo != null && (foo.constructor !== Boolean || foo == true)) {
alert("foo is something or boolean true");
} else {
alert("foo is null, undefined or boolean false");
}
Primero verifica que la variable se haya definido y luego, si es booleano, es cierto.
Mientras tanto tu declaración falsa está comprobando algo diferente:
if (foo == false) {
alert("foo is populated with the boolean false");
} else {
alert("foo is true, something else or null");
}
El algoritmo ==
( Algoritmo de comparación de igualdad abstracta ) no es algo en el que se pueda asumir un resultado a menos que se conozca el algoritmo. Necesitas saber los detalles de cómo funciona.
Por ejemplo, null
y undefined
son un caso especial. No hacen ninguna conversión de tipos que no sea que se consideren iguales entre sí.
De lo contrario, normalmente hay una conversión de tipo que intenta reducir ambos operandos a un tipo común. Esto a menudo termina siendo una conversión toNumber .
Es por eso:
null == undefined; // true
null == 0; // false
+null == ''0'' // true
Entonces, si sabe cómo funciona el algoritmo, sabe que undefined
nunca equivale a nada excepto a undefined
y null
, pero otros tipos que no son estrictamente iguales pueden ser obligados a tipos que sean iguales.
Así que if(!x)
vs if(x==false)
son pruebas completamente diferentes.
if(!x)
realiza conversión a booleano .if(x == false)
utiliza un algoritmo complejo para decidir la conversión correcta.
Así que con ...
if(x == false)
... si x
undefined
está undefined
, se determina que no es igual a false
, sin embargo, si x
es 0
o incluso "0"
, se considerará igual a false
.
0 == false; // true
"0" == false; // true
La verdad y la equivalencia con la true
son dos cosas diferentes en JavaScript.
El if (...)
ejecuta la primera declaración si ...
es " veraz ", no cuando son "iguales" a cualquier otro valor en particular, por lo que su segundo condicional debería verse como
if (!foo) {
alert("foo is falsy"); // Javascript executes this row
} else {
alert("foo is truthy");
}
Hay bastantes valores "falsos" en JavaScript: NaN
, ""
, 0
, -0
, false
, null
, undefined
. Todos los demás valores son truthy
.
El el operador devuelve false
para cualquier valor true
y true
para cualquier valor falsy
, por lo que !x
es lo mismo que (x ? false : true)
para todo x
.
undefined no es igual a falso, pero cuando intenta evaluar:
if (undefined)
toda la expresión es siempre falsa
más información: http://www.mapbender.org/JavaScript_pitfalls:_null,_false,_undefined,_NaN