if([] == false) alert('empty array is false');
alert(+[]) // alert 0
if([]) alert('empty array is true');
どちらもアラートを実行します
if([] == false) alert('empty array is false');
alert(+[]) // alert 0
if([]) alert('empty array is true');
どちらもアラートを実行します
これは、==
(等価) 演算子の型強制が原因です。
空の配列は (空のオブジェクトと同様に) 真であると見なされるため、2 番目のアラートが呼び出されます。
ただし、を使用する([] == false)
と、配列はその文字列表現*に強制されます。これは""
、偽の値と見なされ、条件が真になり、最初のアラートもトリガーされます。
型の強制を避けたい場合は、===
(同一性)演算子を使用する必要があります。
詳細については、この包括的な回答を参照してください。
* (Object.prototype.toString
が呼び出されます)
編集:JS比較で楽しい:
NaN == false // false
NaN == true // also false
NaN == NaN // false
if(NaN) // false
if(!NaN) // true
0 == '0' // true
'' == 0 // true
'' == '0' // false !
==
これは、 bfavarettos の回答で言及されている奇妙なルールによる比較の本当の「力」を示しています。
ここでの現在の回答は両方とも正しいですが、言語仕様に基づいてより詳細な説明を追加したいと思います。明らかに矛盾する結果の理由は、if
ステートメントと等値比較の評価が異なるためです。
if(expression)
ステートメントの場合、式が評価され、ブール型に変換されます ( § 12.5 )。配列はオブジェクトであり、オブジェクトがブール値に変換されると、結果は常にtrue
( § 9.2 ) になります。
との等値比較は、 § 11.9.3==
で詳述されている別の一連のルールに従います。比較では、両方のオペランドが同じ型になるまで、複数の型変換が必要になる場合があります。オペランドの順序も重要です。そのアルゴリズムによると、比較は実際には 4 段階の操作であることがわかります。[] == false
true
値をブール値として評価することと、またはと比較することには違いがありますfalse
。
演算子を使用する==
と、型が対応するように値が変換されます。[]
空の文字列に変換された値、""
およびそれをブール値に変換すると、 truefalse
に[] == false
なります。
[]
ブール値として評価すると、 が返されます。これは、、、、または などtrue
の「偽の」値ではないためです。0
false
null
""
NaN
undefined