Existe una pregunta de este tipo en un conjunto de preguntas de prueba compilado por cssrain:
<IDIOMA DE ESCRITURA="JavaScript">
var a = 0;
var b = -1;
var c = 1;
función afirmar (aVar) {
if (aVar==verdadero) alerta(verdadero);
más alerta (falso);
}
afirmar (a);
afirmar (b);
afirmar(c);
</SCRIPT>
Ejecutar cuadro de código
[Ctrl+A Seleccionar todos los consejos: primero puede modificar parte del código y luego presionar Ejecutar]
Según tengo entendido, cualquier valor booleano que no sea 0 debería ser verdadero.
Pero el resultado correcto de esta pregunta es: falso falso verdadero.
El valor de (-1==verdadero) es falso.
Veamos el siguiente ejemplo:
<IDIOMA DE ESCRITURA="JavaScript">
var a = 0;
var b = -1;
var c = 1;
función afirmar (aVar) {
si (aVar) alerta (verdadero);
más alerta (falso);
}
afirmar (a);
afirmar (b);
afirmar(c);
</SCRIPT>
Ejecutar cuadro de código
[Ctrl+A Seleccionar todos los consejos: primero puede modificar parte del código y luego presionar Ejecutar]
Los resultados de ejecución son: falso, verdadero, verdadero.
Aquí encontramos que los resultados de if(aVar) y if(aVar == true) no son los mismos.
La explicación de cssrain en la respuesta es:
if(aVar) y if (aVar==true) tienen respuestas muy diferentes para números negativos.
¿Es realmente la razón del número negativo? Considere el siguiente ejemplo:
Ejecutar cuadro de código
[Ctrl+A Seleccionar todos los consejos: primero puede modificar parte del código y luego presionar Ejecutar]
¿Por qué el número positivo 2 también devuelve falso? Convirtamos el número en un valor booleano y echemos un vistazo.
Ejecutar cuadro de código
[Ctrl+A Seleccionar todos los consejos: primero puede modificar parte del código y luego presionar Ejecutar]
Los valores booleanos distintos de cero aquí son realmente verdaderos, lo que significa que todos los problemas se centran en el operador == en 2 == verdadero. Es básicamente seguro que == no debe convertir números a valores booleanos y luego compararlos.
Mire lo que dice ECMA-262 (página 80):
6.Si Type(x) es booleano, devuelve el resultado de la comparación ToNumber(x) == y.
7.Si Type(y) es booleano, devuelve el resultado de la comparación x == ToNumber(y).
Es decir, los valores booleanos primero se convierten a números y luego se comparan. El valor numérico de verdadero es 1 y falso es 0. Entonces ni 2 ni -1 pueden ser iguales a verdadero.
Mire más de cerca el siguiente ejemplo:
<IDIOMA DE ESCRITURA="JavaScript">
var a = "indefinido";
var b = "falso";
var c = "";
función afirmar (aVar) {
if (aVar==verdadero) alerta(verdadero);
más alerta (falso);
}
afirmar (a);
afirmar (b);
afirmar(c);
</SCRIPT>
Ejecutar cuadro de código
[Ctrl+A Seleccionar todos los consejos: primero puede modificar parte del código y luego presionar Ejecutar]
Según la idea anterior, verdadero se convertirá en 1, por lo que las tres declaraciones devolverán falso. Ejecútelo y descubra que efectivamente es así.
A continuación, cambie if(aVar==true) a if(aVar).
Ejecutar cuadro de código
[Ctrl+A Seleccionar todos los consejos: primero puede modificar parte del código y luego presionar Ejecutar]
Los resultados de la ejecución en este momento son verdadero, verdadero y falso. Porque los resultados de booleano ("indefinido"), booleano ("falso") y booleano ("") son verdadero, verdadero y falso. Las cadenas no vacías se convierten a booleanos verdaderos.
Finalmente, hay un ejemplo para explicar las reglas de comparación cuando ambos lados de == son cadenas y números.
Ejecutar cuadro de código
[Ctrl+A Seleccionar todos los consejos: primero puede modificar parte del código y luego presionar Ejecutar]
¿Descubrió que este "001"==true es cierto?
Porque verdadero se convierte primero en 1. Luego consulte las reglas de ECMA:
4.Si Type(x) es Number y Type(y) es String, devuelve el resultado de la comparación x == ToNumber(y).
5.Si Type(x) es String y Type(y) es Number, devuelve el resultado de la comparación ToNumber(x) == y.
La cadena se va a convertir en un número y el valor de Número ("001") también es 1, por lo que el resultado es verdadero.