Existe essa pergunta em um conjunto de perguntas de teste compilado por cssrain:
<SCRIPT LANGUAGE="JavaScript">
var a = 0;
var b = -1;
varc = 1;
função afirmar (aVar) {
if (aVar==true) alerta(true);
senão alerta(falso);
}
afirmar(a);
afirmar(b);
afirmar(c);
</SCRIPT>
Execute a caixa de código
[Ctrl+A Selecionar todas as dicas: você pode modificar parte do código primeiro e depois pressionar Executar]
Pelo que entendi, qualquer valor booleano que não seja 0 deve ser verdadeiro.
Mas a saída correta desta questão é: falso falso verdadeiro.
O valor de (-1==true) é falso.
Vejamos o seguinte exemplo:
<SCRIPT LANGUAGE="JavaScript">
var a = 0;
var b = -1;
varc = 1;
função afirmar (aVar) {
if (aVar) alerta(verdadeiro);
senão alerta(falso);
}
afirmar(a);
afirmar(b);
afirmar(c);
</SCRIPT>
Execute a caixa de código
[Ctrl+A Selecionar todas as dicas: você pode modificar parte do código primeiro e depois pressionar Executar]
Os resultados em execução são: falso, verdadeiro, verdadeiro.
Aqui, descobrimos que os resultados de if(aVar) e if(aVar == true) não são iguais.
A explicação de cssrain na resposta é:
if(aVar) e if (aVar==true) têm respostas muito diferentes para números negativos.
É realmente a razão do número negativo? Considere o seguinte exemplo:
Execute a caixa de código
[Ctrl+A Selecionar todas as dicas: você pode modificar parte do código primeiro e depois pressionar Executar]
Por que o número positivo 2 também retorna falso? Vamos converter o número em um valor booleano e dar uma olhada.
Execute a caixa de código
[Ctrl+A Selecionar todas as dicas: você pode modificar parte do código primeiro e depois pressionar Executar]
Os valores booleanos diferentes de zero aqui são realmente verdadeiros, o que significa que todos os problemas se concentram no operador == em 2==true. É basicamente certo que == não deve converter números em valores booleanos e depois compará-los.
Veja o que ECMA-262 (página 80) diz:
6.Se Type(x) for Booleano, retorne o resultado da comparação ToNumber(x) == y.
7.Se Type(y) for Booleano, retorne o resultado da comparação x == ToNumber(y).
Ou seja, os valores booleanos são primeiro convertidos em números e depois comparados. O valor numérico de verdadeiro é 1 e falso é 0. Portanto, nem 2 nem -1 podem ser iguais a verdadeiro.
Observe mais de perto o seguinte exemplo:
<SCRIPT LANGUAGE="JavaScript">
var a = "indefinido";
var b = "falso";
var c = "";
função afirmar (aVar) {
if (aVar==true) alerta(true);
senão alerta(falso);
}
afirmar(a);
afirmar(b);
afirmar(c);
</SCRIPT>
Execute a caixa de código
[Ctrl+A Selecionar todas as dicas: você pode modificar parte do código primeiro e depois pressionar Executar]
De acordo com a ideia anterior, verdadeiro será convertido em 1, portanto todas as três afirmações retornarão falso. Execute-o e descubra que é realmente esse o caso.
Em seguida, altere if(aVar==true) para if(aVar).
Execute a caixa de código
[Ctrl+A Selecionar todas as dicas: você pode modificar parte do código primeiro e depois pressionar Executar]
Os resultados em execução neste momento são verdadeiros, verdadeiros, falsos. Porque os resultados de Boolean("indefinido"), Boolean("false") e Boolean("") são verdadeiros, verdadeiros e falsos. Strings não vazias são convertidas em booleano verdadeiro.
Finalmente, há um exemplo para explicar as regras de comparação quando ambos os lados de == são strings e números.
Execute a caixa de código
[Ctrl+A Selecionar todas as dicas: você pode modificar parte do código primeiro e depois pressionar Executar]
Você descobriu que "001"==true é verdade.
Porque true é convertido em 1 primeiro. Em seguida, consulte as regras da ECMA:
4.Se Type(x) for Number e Type(y) for String, retorne o resultado da comparação x == ToNumber(y).
5.Se Type(x) for String e Type(y) for Number, retorne o resultado da comparação ToNumber(x) == y.
A string deve ser convertida em um número e o valor de Number("001") também é 1, portanto o resultado é verdadeiro.