14
if([] == false) alert('empty array is false');
alert(+[]) // alert 0
if([]) alert('empty array is true');

どちらもアラートを実行します

デモ

4

3 に答える 3

18

これは、==(等価) 演算子の型強制が原因です。

空の配列は (空のオブジェクトと同様に) 真であると見なされるため、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 の回答で言及されている奇妙なルールによる比較の本当の「力」を示しています。

于 2012-12-10T11:00:30.057 に答える
18

ここでの現在の回答は両方とも正しいですが、言語仕様に基づいてより詳細な説明を追加したいと思います。明らかに矛盾する結果の理由は、ifステートメントと等値比較の評価が異なるためです。

if(expression)ステートメントの場合、が評価され、ブール型に変換されます ( § 12.5 )。配列はオブジェクトであり、オブジェクトがブール値に変換されると、結果は常にtrue( § 9.2 ) になります。

との等値比較は、 § 11.9.3==で詳述されている別の一連のルールに従います。比較では、両方のオペランドが同じ型になるまで、複数の型変換が必要になる場合があります。オペランドの順序も重要です。そのアルゴリズムによると、比較は実際には 4 段階の操作であることがわかります。[] == false

  1. 関連するブール値があるため、最初に数値に変換されます (アルゴリズムのステップ 7)。したがって、次のようになります。

    [] == 0
    
  2. 次に、配列はプリミティブ値に変換され ( § 9.1および§ 8.12.8を参照)、空の文字列になります (ステップ 9)。そう:

    "" == 0
    
  3. 文字列を数値と比較する場合、最初に文字列が数値に変換されます (手順 5、§ 9.3.1で説明されている規則に従います)。

    0 == 0
    
  4. 2 つの Number があるので、比較はtrueステップ 1.c.iii に従って評価されます。
于 2012-12-10T13:01:01.387 に答える
3

true値をブール値として評価することと、またはと比較することには違いがありますfalse

演算子を使用する==と、型が対応するように値が変換されます。[]空の文字列に変換された値、""およびそれをブール値に変換すると、 truefalse[] == falseなります。

[]ブール値として評価すると、 が返されます。これは、、、、または などtrueの「偽の」値ではないためです。0falsenull""NaNundefined

于 2012-12-10T11:01:57.170 に答える