ti-enxame.com

por que os números negativos do Javascript nem sempre são verdadeiros ou falsos?

-1 == true;        //false
-1 == false        //false
-1 ? true : false; //true

Alguém pode explicar a saída acima? Eu sei que poderia contornar isso comparando com 0, mas estou interessado. Eu esperaria que pelo menos uma das declarações de sloppy equals fosse verdadeira, pois elas fazem conversão implícita de tipo, e certamente não esperava que o ternário apresentasse um resultado totalmente diferente.

50
Ollie Edwards

Nos dois primeiros casos, o booleano é convertido em um número - 1 para true e 0 para false . No caso final, é um número que é convertido em um booleano e qualquer número, exceto 0 e NaN, será convertido para true . Portanto, seus casos de teste são realmente mais assim:

-1 == 1; // false
-1 == 0; // false
true ? true : false; // true

O mesmo vale para qualquer número que não seja 0 ou 1.

Para mais detalhes, leia a documentação do ECMAScript. Do a edição [PDF] , seção 11.9.3 O algoritmo de comparação de igualdade abstrata :

19 . Se Type (y) for Boolean, retorne o resultado da comparação x == ToNumber (y).

Vale a pena ler o algoritmo completo porque outros tipos podem causar piores dicas.

60
Andy E

Na maioria dos sistemas, valores diferentes de zero são considerados um valor verdadeiro, mas isso não significa necessariamente que eles sejam o valor mesmo valor verdadeiro como true. Portanto, -1 == true não necessariamente se sustenta, mas -1 ainda pode ser considerado um valor verdadeiro, pois é diferente de zero.

Realmente, porém, você não deve comparar números inteiros com booleanos se puder evitá-lo.

1
Amber