JavaScriptについての良い本を読んでいた。
で始まった:
ブール型は、trueとfalseの2つのリテラル値のみを取ります。これらは数値とは異なるため、trueは1ではなく、falseは0ではありません。
しかし、私は次のことを観察しました:
if(1==true)
document.write("oh!!! that's true"); //**this is displayed**
JavaScriptのすべての型には、ブール値に相当するものがあります。
しかし、その後、真実は何ですか?
true
およびfalse
がJavascriptの数値を表していないことは事実です。
一部の言語(C、VBなど)では、ブール値は実際の数値として定義されているため、1と0(または-1と0)の異なる名前にすぎません。
他の一部の言語(Pascal、C#など)には、数値ではない明確なブール型があります。ブール値と数値の間で変換することは可能ですが、自動的には行われません。
Javascriptは、明確なブール型を持つカテゴリに分類されますが、一方でJavascriptは異なるデータ型間で値を変換することに非常に熱心です。
たとえば、数値はブール値ではありませんが、ブール値が必要な場合は数値を使用できます。 if (1) {...}
を使用すると、if (true) {...}
と同様に機能します。
例のように値を比較する場合、==
演算子と===
演算子には違いがあります。 ==
等号演算子は、一致を見つけるためにタイプ間を喜んで変換します。したがって、true
は1 == true
に変換されるため、1
はtrueと評価されます。 ===
型の等価演算子は型変換を行わないため、値が異なる型であるため、1 === true
はfalseと評価されます。
JavaScriptでは、==は「Probably Equals」と発音されます。
つまり、JavaScriptはブール値を自動的に整数に変換してから、両者を比較しようとします。
真の等価性を得るには、===演算子を使用します。
厳密な等価比較を試してください:
if(1 === true)
document.write("oh!!! that's true"); //**this is not displayed**
==
演算子はある型から別の型への変換を行いますが、===
演算子は変換しません。
ECMAScript仕様のセクション11.9.3抽象等価比較アルゴリズム:
Xとyが値であるx == yの比較では、trueまたはfalseが生成されます。このような比較は次のように実行されます。
- Type(y)がブール値の場合、比較結果x == ToNumber(y)を返します。
したがって、if (1 == true)
、true
はNumber
、つまりNumber(true)
に強制変換され、1
の値になり、最終的なif (1 == 1)
これはtrue
です。
if (0 == false)
なので、Number(false) == 0
はまったく同じロジックです。
代わりに厳密な等号演算子===
を使用する場合、これは発生しません。
比較x === y(xとyは値)は、trueまたはfalseを生成します。このような比較は次のように実行されます。
- Type(x)がType(y)と異なる場合、falseを返します。
ああ、恐ろしいルーズな比較演算子が再び攻撃します。絶対に使用しないでください。代わりに、厳密な比較、===または!==を常に使用してください。
ボーナスファクト:0 == ''
実際、javascriptのすべてのオブジェクトは、W3Cschoolsが「本当の価値」を持っている場合にtrueに解決されます。つまり、""
、NaN
、undefined
、null
、または0
以外のすべてを意味します。
ブール値を比較する前に数値1に変換されるため、==
演算子を使用してブール値に対して数値をテストするのは実際には少し奇妙です。次のような操作を行うと、さらに混乱します。
var fred = !!3; // will set fred to true
var joe = !!0; // will set joe to false
alert("fred = "+ fred + ", joe = "+ joe);
javascriptのすべてが意味をなすわけではありません;)
何かをブール値と比較すると、次のように動作します
ステップ1:boolean
をNumber
Number(true) // 1
およびNumber(false) // 0
に変換します
ステップ2:両側を比較する
boolean == someting
-> Number(boolean) === someting
1
と2
をtrue
と比較すると、次の結果が得られます。
true == 1
-> Number(true) === 1
-> 1 === 1
-> true
そして
true == 2
-> Number(true) === 1
-> 1 === 2
-> false
===
の代わりに==
を使用して変数を同等にします。
==
は、変数の値が類似しているかどうかを確認します
===
は、変数の値と変数の型が類似しているかどうかを確認します
気づく方法
if(0===false) {
document.write("oh!!! that's true");
}
そして
if(0==false) {
document.write("oh!!! that's true");
}
異なる結果を与える
Well ==はジョーク比較演算子であり、js開発者として==を比較に使用してはいけません。すべての==比較質問は、最初は無効です。