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の「偽の」値ではないためです。0falsenull""NaNundefined