cssrain によってコンパイルされたテスト質問セットに次のような質問があります。
<スクリプト言語="JavaScript">
変数 a = 0;
var b = -1;
var c = 1;
関数アサート (aVar) {
if (aVar==true) アラート(true);
それ以外の場合はアラート(偽);
}
アサート(a);
アサート(b);
アサート(c);
</スクリプト>
コードボックスを実行
[Ctrl+A すべて選択 ヒント: 最初にコードの一部を変更してから実行を押すことができます]
私の理解によれば、0 以外のブール値はすべて true になるはずです。
ただし、この質問の正しい出力は false false true です。
(-1==true) の値は false です。
次の例を見てみましょう。
<スクリプト言語="JavaScript">
変数 a = 0;
var b = -1;
var c = 1;
関数アサート (aVar) {
if (aVar) アラート (true);
それ以外の場合はアラート(偽);
}
アサート(a);
アサート(b);
アサート(c);
</スクリプト>
コードボックスを実行
[Ctrl+A すべて選択 ヒント: 最初にコードの一部を変更してから実行を押すことができます]
実行結果は、false、true、true です。
ここで、if(aVar) と if(aVar == true) の結果が同じではないことがわかります。
回答における cssrain の説明は次のとおりです。
if(aVar) と if (aVar==true) の負の数に対する答えは大きく異なります。
本当にそれがマイナスの理由なのでしょうか?次の例を考えてみましょう。
コードボックスを実行
[Ctrl+A すべて選択 ヒント: 最初にコードの一部を変更してから実行を押すことができます]
正の数 2 も false を返すのはなぜですか?数値をブール値に変換して見てみましょう。
コードボックスを実行
[Ctrl+A すべて選択 ヒント: 最初にコードの一部を変更してから実行を押すことができます]
ここでのゼロ以外のブール値は実際に true です。これは、すべての問題が 2==true の == 演算子に焦点を当てていることを意味します。 == は数値をブール値に変換して比較してはいけないということは基本的に確実です。
ECMA-262 (80 ページ) の内容を見てください。
6.Type(x) が Boolean の場合、ToNumber(x) == y の比較結果を返します。
7.Type(y) が Boolean の場合、比較 x == ToNumber(y) の結果を返します。
つまり、ブール値はまず数値に変換されてから比較されます。 true の数値は 1、false は 0 です。したがって、2 も -1 も true に等しくなりません。
次の例を詳しく見てみましょう。
<スクリプト言語="JavaScript">
var a = "未定義";
var b = "偽";
var c = "";
関数アサート (aVar) {
if (aVar==true) アラート(true);
それ以外の場合はアラート(偽);
}
アサート(a);
アサート(b);
アサート(c);
</スクリプト>
コードボックスを実行
[Ctrl+A すべて選択 ヒント: 最初にコードの一部を変更してから実行を押すことができます]
前の考え方によれば、true は 1 に変換されるため、3 つのステートメントはすべて false を返します。実行してみると、実際にそうなっていることがわかります。
次に、if(aVar==true) を if(aVar) に変更します。
コードボックスを実行
[Ctrl+A すべて選択 ヒント: 最初にコードの一部を変更してから実行を押すことができます]
このときの実行結果はtrue、true、falseとなります。これは、Boolean("unknown")、Boolean("false")、および Boolean("") の結果が true、true、および false であるためです。空でない文字列はブール値 true に変換されます。
最後に、== の両辺が文字列と数値の場合の比較規則を説明する例を示します。
コードボックスを実行
[Ctrl+A すべて選択 ヒント: 最初にコードの一部を変更してから実行を押すことができます]
この「001」==true が true であることがわかりました。
true が最初に 1 に変換されるためです。次に、ECMA のルールを参照してください。
4.Type(x) が Number で、Type(y) が String の場合、比較の結果 x == ToNumber(y) を返します。
5.Type(x) が String で、Type(y) が Number の場合、ToNumber(x) == y の比較結果を返します。
文字列は数値に変換され、Number("001") の値も 1 であるため、結果は true になります。