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

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

4

3 に答える 3

75

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

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

0 でも 1 でもない数についても同じことが言えます。

詳細については、ECMAScript のドキュメントを参照してください。第3 版 [PDF]のセクション11.9.3 The Abstract Equality Comparison Algorithmから:

19 . Type(y) が Boolean の場合、比較 x == ToNumber(y) の結果を返します。

他のタイプはより悪い落とし穴を引き起こす可能性があるため、完全なアルゴリズムを読む価値があります。

于 2010-09-01T15:42:35.023 に答える
4

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

ただし、実際には、回避できるのであれば、整数とブール値を比較するべきではありません。

于 2010-09-01T15:43:47.487 に答える
-3

テスト条件として評価されると、-1、5、17,000,000 などの整数はすべて、論理的に true と評価されるため、ブール型の trueを返します。

if(-1) {
    "This is true";
}
else {
    "This is false";
}
=> "This is true";

(注: 0 は論理的に false と評価されます)

「?」の使い方 operator は、このコードがまさに行うことを行います。最初の引数をifステートメントの条件として渡し、2 番目の引数をtrueケースとして渡し、3 番目の引数をfalseケースとして渡します。

したがって、3番目の結果。


ただし、これらの整数はtrueと同じではありません。

TrueBoolean型、-1、5 および 17,000,000Integer型です。

比較「==」は、型比較に関して厳密です。2 つのものが同じ「値」を持っていても、同じ型ではない場合、「==」演算子はfalseを返します。

if(6 == true) {
    "This is true";
}
else {
    "This is false";
}
=> "This is false";

"true"String型でtrueBoolean型であるため、以下でも false が返されます。

if("true" == true) {
    "This is true";
}
else {
    "This is false";
}
=> "This is false";

したがって、最初の 2 つの結果が得られます。


注: タイプに関係なく値を比較したい場合は、「===」演算子を使用します。

if(6 === true) {
    "This is true";
}
else {
    "This is false";
}
=> "This is true";

また、

if("true" === true) {
    "This is true";
}
else {
    "This is false";
}
=> "This is true";


お役に立てれば!

于 2016-04-21T11:21:39.473 に答える