誰も次の2つのステートメントがともにと評価される理由を誰でも説明できますか??空のJavaScript配列のブール値が矛盾しています
[] == false
と
!![]
この質問は、なぜこれが起こるの好奇心から、純粋ではなく、配列が空の最善の方法をテストする場合について。
誰も次の2つのステートメントがともにと評価される理由を誰でも説明できますか??空のJavaScript配列のブール値が矛盾しています
[] == false
と
!![]
この質問は、なぜこれが起こるの好奇心から、純粋ではなく、配列が空の最善の方法をテストする場合について。
最初のもの:
[] == false
==
オペレータは、そのオペランドへの変換を入力し、この場合、両側を数値に変換され、Abstract Equality Comparison Algorithmに取られるステップは次のようになります。
:
[] == false; // convert false to Number
[] == 0; // convert [] to Primitive (toString/valueOf)
"" == 0; // convert "" to Number
0 == 0; // end
第2の比較、[]
は、それらvalueOf
とtoString
方法が実行され、プリミティブに変換されるが、配列オブジェクトのvalueOf
ので、オブジェクトを返しますそれ自体(Object.prototype
から継承されます)、toString
メソッドが使用されます。終わり
あなたが見るように、両方のオペランドが数値に変換され、両方の利回りゼロ、例えば:その文字列表現が空の文字列であるため、数値に変換するとき
Number([]) == 0;
Number(false) == 0;
そして、空の配列がゼロを生成します:
[].toString(); // ""
と番号に変換し、空の文字列、利回りゼロ:
+""; // 0
すべてのオブジェクトインスタンスがtruthyあるので今、二重否定(!![]
)が真の生成:
![]; // false, [] is truthy
!![]; // true, negation
falseyのみ値は次のとおりです。
null
undefined
0
NaN
""
(空の文字列)false
ブールに変換する場合それ以外はtrue
が生成されます。
見る:この場合
非常に面白いです。詳細な説明とそれらのリンクの共有に感謝します。 –
私は同じ質問に同じように答えたようです。その人にその質問のマークを付けるまでは気づかなかった。 http://stackoverflow.com/a/10556035/2653 –
[] ==偽
、左側のタイプは、右のタイプのオブジェクトであります手の側はブール値です。オブジェクトが(==抽象均等比較)ブール値と比較されるとき、Javascriptはブール値を最初に数値に変換して0を返します。次にオブジェクトを「プリミティブ」に変換して空の文字列「」を返します。次に、空の文字列を0と比較します。空の文字列は数値に変換され、右辺の0に数値的に等しい0が返されるため、式全体の結果がtrueになります。
文献: http://es5.github.com/#x11.9.3 11.9.3抽象等価比較アルゴリズム
!! []この場合
Javascriptが、その後偽で得られ、それを反転させ、真のブール値にオブジェクトを変換します。
:あなたの解決策についてもっと説明してください。参照:[回答方法](http://stackoverflow.com/questions/how-to-answer) – askmish
本当に手を汚したければ、[the Equals Operator == "*]と[8.7.1項(*" GetValue(V) "*)を[ spec](http://www.ecma-international.org/publications/standards/Ecma-262.htm)。そして、これは '== true'と' == false'が一般的に理想的なスタイルでない理由のもう一つの素晴らしい例です。 :-) –
実際には、==や!=を使うのは良いスタイルではありません。 ===または!==を常に使用し、オペランドを手作業でキャストします。 –
'[] == []; // false' –