bitwise - ¿Por qué los números negativos de Javascript no siempre son verdaderos o falsos?
bitwise traduccion (3)
En la mayoría de los sistemas, los valores distintos de cero se consideran un valor verdadero, pero eso no significa necesariamente que tengan el mismo valor true
que true
. Por lo tanto, -1 == true
no necesariamente se mantiene, pero -1
aún se puede considerar un valor verdadero ya que no es cero.
Realmente, sin embargo, no deberías estar comparando enteros con booleanos si puedes evitarlo.
-1 == true; //false
-1 == false //false
-1 ? true : false; //true
¿Alguien puede explicar el resultado anterior? Sé que podría solucionar esto comparando con 0, pero estoy interesado. Esperaría que al menos una de las declaraciones equals descuidadas fuera cierta, ya que hacen una conversión de tipo implícita, y ciertamente no esperaba que el ternario produjera un resultado totalmente diferente.
En los primeros dos casos, el valor booleano se convierte en un número: 1 para verdadero y 0 para falso . En el caso final, es un número que se convierte en booleano y cualquier número excepto 0 y NaN se convertirá en verdadero . Entonces sus casos de prueba son más como esto:
-1 == 1; // false
-1 == 0; // false
true ? true : false; // true
Lo mismo ocurriría con cualquier número que no sea 0 o 1.
Para obtener más detalles, lea la documentación de ECMAScript. De la 3ª edición [PDF] , sección 11.9.3 El algoritmo de comparación de igualdad abstracta :
19 . Si Type (y) es booleano, devuelva el resultado de la comparación x == ToNumber (y).
Vale la pena leer el algoritmo completo porque otros tipos pueden causar peores errores.
Cuando se evalúa como una condición de prueba, enteros como -1, 5 y 17,000,000, todos devuelven verdadero booleano , porque lógicamente evalúan como verdadero, por ejemplo
if(-1) {
"This is true";
}
else {
"This is false";
}
=> "This is true";
(Nota: 0 lógicamente se evalúa como falso)
Utilizando el "?" el operador hace lo que hace este código. Pasa el primer argumento como una condición en una instrucción if , pasa el segundo argumento como el caso verdadero y pasa el tercer argumento como el caso falso .
De ahí el tercer resultado.
Sin embargo, estos enteros no son del mismo tipo que verdaderos .
True es de tipo Boolean , -1, 5 y 17,000,000 son de tipo entero .
La comparación ''=='' es estricta, en términos de comparación de tipos. Incluso dos cosas tienen el mismo "valor", pero no del mismo tipo, el operador "==" devuelve falso :
if(6 == true) {
"This is true";
}
else {
"This is false";
}
=> "This is false";
Incluso lo siguiente devolverá falso, porque "true" es de tipo String y true es de tipo Boolean :
if("true" == true) {
"This is true";
}
else {
"This is false";
}
=> "This is false";
Por lo tanto, los primeros dos resultados.
Nota: Si desea comparar valores independientemente del tipo, utilice el operador "===":
if(6 === true) {
"This is true";
}
else {
"This is false";
}
=> "This is true";
y también,
if("true" === true) {
"This is true";
}
else {
"This is false";
}
=> "This is true";
¡Espero que esto ayude!