web-dev-qa-db-ja.com

JavaScriptでtrue == 1およびfalse == 0ですか?

JavaScriptについての良い本を読んでいた。

で始まった:

ブール型は、trueとfalseの2つのリテラル値のみを取ります。これらは数値とは異なるため、trueは1ではなく、falseは0ではありません。

しかし、私は次のことを観察しました:

if(1==true)
  document.write("oh!!! that's true");  //**this is displayed**

JavaScriptのすべての型には、ブール値に相当するものがあります。

しかし、その後、真実は何ですか?

42
Mahesha999

trueおよびfalseがJavascriptの数値を表していないことは事実です。

一部の言語(C、VBなど)では、ブール値は実際の数値として定義されているため、1と0(または-1と0)の異なる名前にすぎません。

他の一部の言語(Pascal、C#など)には、数値ではない明確なブール型があります。ブール値と数値の間で変換することは可能ですが、自動的には行われません。

Javascriptは、明確なブール型を持つカテゴリに分類されますが、一方でJavascriptは異なるデータ型間で値を変換することに非常に熱心です。

たとえば、数値はブール値ではありませんが、ブール値が必要な場合は数値を使用できます。 if (1) {...}を使用すると、if (true) {...}と同様に機能します。

例のように値を比較する場合、==演算子と===演算子には違いがあります。 ==等号演算子は、一致を見つけるためにタイプ間を喜んで変換します。したがって、true1 == trueに変換されるため、1はtrueと評価されます。 ===型の等価演算子は型変換を行わないため、値が異なる型であるため、1 === trueはfalseと評価されます。

61
Guffa

JavaScriptでは、==は「Probably Equals」と発音されます。

つまり、JavaScriptはブール値を自動的に整数に変換してから、両者を比較しようとします。

真の等価性を得るには、===演算子を使用します。

43
Madara Uchiha

厳密な等価比較を試してください:

if(1 === true)
    document.write("oh!!! that's true");  //**this is not displayed**

==演算子はある型から別の型への変換を行いますが、===演算子は変換しません。

12
Evandro Silva

ECMAScript仕様のセクション11.9.3抽象等価比較アルゴリズム

Xとyが値であるx == yの比較では、trueまたはfalseが生成されます。このような比較は次のように実行されます。

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

したがって、if (1 == true)trueNumber、つまりNumber(true)に強制変換され、1の値になり、最終的なif (1 == 1)これはtrueです。

if (0 == false)なので、Number(false) == 0はまったく同じロジックです。

代わりに厳密な等号演算子===を使用する場合、これは発生しません。

11.9.6厳密な等価比較アルゴリズム

比較x === y(xとyは値)は、trueまたはfalseを生成します。このような比較は次のように実行されます。

  • Type(x)がType(y)と異なる場合、falseを返します。
9
João Silva

ああ、恐ろしいルーズな比較演算子が再び攻撃します。絶対に使用しないでください。代わりに、厳密な比較、===または!==を常に使用してください。

ボーナスファクト:0 == ''

3
erikkallen

実際、javascriptのすべてのオブジェクトは、W3Cschoolsが「本当の価値」を持っている場合にtrueに解決されます。つまり、""NaNundefinednull、または0以外のすべてを意味します。

ブール値を比較する前に数値1に変換されるため、==演算子を使用してブール値に対して数値をテストするのは実際には少し奇妙です。次のような操作を行うと、さらに混乱します。

    var fred = !!3; // will set fred to true 
    var joe = !!0; // will set joe to false
    alert("fred = "+ fred + ", joe = "+ joe);

javascriptのすべてが意味をなすわけではありません;)

2
Stefan Nolde

何かをブール値と比較すると、次のように動作します

ステップ1:booleanNumberNumber(true) // 1およびNumber(false) // 0に変換します

ステップ2:両側を比較する

boolean == someting 
-> Number(boolean) === someting

12trueと比較すると、次の結果が得られます。

true == 1
-> Number(true) === 1
-> 1 === 1
-> true

そして

true == 2
-> Number(true) === 1
-> 1 === 2
-> false
1
webHasan

===の代わりに==を使用して変数を同等にします。

==は、変数の値が類似しているかどうかを確認します

===は、変数の値と変数の型が類似しているかどうかを確認します

気づく方法

if(0===false) {
    document.write("oh!!! that's true");
}​

そして

if(0==false) {
    document.write("oh!!! that's true");
}​

異なる結果を与える

0
jacktheripper

Well ==はジョーク比較演算子であり、js開発者として==を比較に使用してはいけません。すべての==比較質問は、最初は無効です。

0
afr0