web-dev-qa-db-ja.com

JavaScriptの負の数が常にtrueまたはfalseとは限らないのはなぜですか?

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

誰かが上記の出力を説明できますか?私は0と比較することでこれを回避できることを知っていますが、興味があります。ずさんなequalsステートメントの少なくとも1つが暗黙的な型変換を行うため、trueであると期待しますが、3項がまったく異なる結果をもたらすとは期待していませんでした。

50
Ollie Edwards

最初の2つのケースでは、ブール値は数値にキャストされます- 1はtrueで、0はfalse 。最後のケースでは、ブールにキャストされるのは数値であり、0とNaNを除くすべての数値はtrueにキャストされます。したがって、テストケースは次のようになります。

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

同じことが0でも1でもないすべての数値に当てはまります。

詳細については、ECMAScriptのドキュメントをご覧ください。 第3版[PDF] から、セクション11.9.3抽象等値比較アルゴリズム

19。 Type(y)がブール値の場合、比較の結果x == ToNumber(y)を返します。

他のタイプはさらにひどい問題を引き起こす可能性があるため、完全なアルゴリズムを読み取っておく価値があります。

60
Andy E

ほとんどのシステムでは、ゼロ以外の値は真の値と見なされますが、必ずしもsametrueと同じ値であるとは限りません。したがって、-1 == trueは必ずしも成立するとは限りませんが、-1はゼロ以外であるため、真の値と見なすことができます。

しかし実際には、整数をブール値と比較するべきではないのであれば、それを比較するべきではありません。

1
Amber