誰かがjavascriptで理由を説明できますか、
alert({} == true)
偽 を示します
if ({}) alert('true')
本当ですか?
結果を変更する if 条件の違いは何ですか?
私は省略形の引数バリデーターを書きたかったのobj || (obj = {});
ですが、この発見に困惑しました。
誰かがjavascriptで理由を説明できますか、
alert({} == true)
偽 を示します
if ({}) alert('true')
本当ですか?
結果を変更する if 条件の違いは何ですか?
私は省略形の引数バリデーターを書きたかったのobj || (obj = {});
ですが、この発見に困惑しました。
if ({}) alert('true')
->true
{}
if
ステートメントのコンテキストで評価されると、 に強制され、Boolean
にBoolean({})
評価されるためtrue
、 を取得するオブジェクトですif (true)
。これは、ECMAScript 仕様のセクション12.5 The if Statementに記載されています。
プロダクション If ステートメント : if ( Expression ) ステートメントは次のように評価されます。
- exprRef を Expression の評価結果とします。
- ToBoolean (GetValue(exprRef))が false の場合、(normal、empty、empty) を返します。
- Statement を評価した結果を返します。
alert({} == true)
->false
これはもっとトリッキーです。ECMAScript仕様のセクション11.9.3 The Abstract Equality Comparison Algorithmから:
x と y が値である比較 x == y は、true または false を生成します。このような比較は、次のように実行されます。
Type(y) が Boolean の場合、比較x == ToNumber(y)の結果を返します。
したがって、{} == true
は として評価され{} == Number(true)
、 は に評価され{} == 1
ますfalse
。
これが、 が に評価1 == true
される理由でもありますが、 に評価されます。true
2 == true
false
0
ブール演算では、通常、真と評価され
ないものはすべて真になります。http://jsfiddle.net/QF8GW/
if (0) console.log("0 shows true"); // does not log a value
if (-1) console.log("-1 shows true");
if (12345) console.log("12345 shows true");
if ({}) console.log("{} shows true");
if ([]) console.log("[] shows true");
これらを除くすべてが0
trueと評価されます。
ただし、それらの値は、と比較した場合、にtrue
評価されませんtrue
。
// logs the statement (1 and true are the same.)
if (1 == true) console.log("1==true shows true");
if (12345 == true) console.log("12345==true shows true"); // does not log
{}
そうではないtrue
ので、最初の例には表示されません。2番目の例{}
ではfalseではないため、テストに合格します。
私の先生がよく言っていたように、じゃがいもとにんじんを比較することはできません。
配列だけでなく、何でも動作します:
alert(3 == true); // shows false
if (3) alert('true'); // shows true
jsfiddle.netで試してみましたが、最初のアラートでfalseと表示されただけで、IFはtrueをアラートしません。
alert({} == true) //display "false"
if({} == true)
{
alert("it's true");
}else
{
alert("it's false"); // <-- alert this
}