2010-11-19 17 views
33

誰も次の2つのステートメントがともにと評価される理由を誰でも説明できますか?空のJavaScript配列のブール値が矛盾しています

[] == false 

!![] 

この質問は、なぜこれが起こるの好奇心から、純粋ではなく、配列が空の最善の方法をテストする場合について。

+1

本当に手を汚したければ、[the Equals Operator == "*]と[8.7.1項(*" GetValue(V) "*)を[ spec](http://www.ecma-international.org/publications/standards/Ecma-262.htm)。そして、これは '== true'と' == false'が一般的に理想的なスタイルでない理由のもう一つの素晴らしい例です。 :-) –

+1

実際には、==や!=を使うのは良いスタイルではありません。 ===または!==を常に使用し、オペランドを手作業でキャストします。 –

+1

'[] == []; // false' –

答えて

58

最初のもの:

[] == false 

==オペレータは、そのオペランドへの変換を入力し、この場合、両側を数値に変換され、Abstract Equality Comparison Algorithmに取られるステップは次のようになります。

  • オブジェクト==ブール
  • オブジェクト==番号
  • 文字列==番号
  • 番号==番号コードで

[] == false; // convert false to Number 
[] == 0;  // convert [] to Primitive (toString/valueOf) 
"" == 0;  // convert "" to Number 
0 == 0;  // end 

第2の比較、[]は、それらvalueOftoString方法が実行され、プリミティブに変換されるが、配列オブジェクトのvalueOfので、オブジェクトを返しますそれ自体(Object.prototypeから継承されます)、toStringメソッドが使用されます。終わり

あなたが見るように、両方のオペランドが数値に変換され、両方の利回りゼロ、例えば:その文字列表現が空の文字列であるため、数値に変換するとき

Number([]) == 0; 
Number(false) == 0; 

そして、空の配列がゼロを生成します:

[].toString(); // "" 

と番号に変換し、空の文字列、利回りゼロ:

+""; // 0 

すべてのオブジェクトインスタンスがtruthyあるので今、二重否定(!![])が真の生成:

![]; // false, [] is truthy 
!![]; // true, negation 

falseyのみ値は次のとおりです。

  • null
  • undefined
  • 0
  • NaN
  • ""(空の文字列)
  • false

ブールに変換する場合それ以外はtrueが生成されます。

見る:この場合

+0

非常に面白いです。詳細な説明とそれらのリンクの共有に感謝します。 –

+0

私は同じ質問に同じように答えたようです。その人にその質問のマークを付けるまでは気づかなかった。 http://stackoverflow.com/a/10556035/2653 –

1

[] ==偽

、左側のタイプは、右のタイプのオブジェクトであります手の側はブール値です。オブジェクトが(==抽象均等比較)ブール値と比較されるとき、Javascriptはブール値を最初に数値に変換して0を返します。次にオブジェクトを「プリミティブ」に変換して空の文字列「」を返します。次に、空の文字列を0と比較します。空の文字列は数値に変換され、右辺の0に数値的に等しい0が返されるため、式全体の結果がtrueになります。

文献: http://es5.github.com/#x11.9.3 11.9.3抽象等価比較アルゴリズム

!! []この場合

Javascriptが、その後偽で得られ、それを反転させ、真のブール値にオブジェクトを変換します。

+0

:あなたの解決策についてもっと説明してください。参照:[回答方法​​](http://stackoverflow.com/questions/how-to-answer) – askmish

関連する問題