2010-12-31 14 views
10

私がJavaScriptで知っている限り!ブール値を正規化して、他の型からtrueまたはfalseに変換します。これは、 "0"がブール値trueに変換されることを意味します。一方、私がそれを偽と比較すると、それは実際には偽であることが分かります(比較結果は真です)。私はここで何のルールを欠いているのですか?私はIEとOperaでそれをテストしました。JavaScriptでアラート(!! "0")とアラート(false == "0")が両方とも出力されるのはなぜですか?

+0

[Boolan(!x)とBoolean(x == 0)の違い?](http://stackoverflow.com/questions/4280344/difference-between-boolanx-and-booleanx-0/4280356) #4280356) – SLaks

答えて

10

演算子==は、真実性とは関係ない緩やかな平等をチェックします。

具体的には、オペランドを数値に変換して数値を比較します。
数値を含む文字列は、数値に含まれる文字列に変換されます。ブール値は01に変換されます。
オブジェクトは、定義されている場合はvalueOfを呼び出して変換されます。

したがって、以下のすべてが真である:

  • "1" == 1
  • "0" == false
  • "1" == true
  • "2" != true
  • "2" != false
  • ({ valueOf:function() { return 2; } }) == 2
  • 最初の発現のため
  • ({ valueOf:function() { return 1; } }) == true
+3

確かに、または要約すると、 "このくそは駄目です" – Claudiu

9

最初のケースでは、空でない文字列はtrueと同じです。

第2のケースでは、1つのオペランドがブール値であるため、両方のオペランドが数値に変換されます。私はfalseが数値0に変換され、文字列"0"も数字0に変換され、結果として0 == 0が真であると信じています。

Mozilla referenceを確認してください。

+0

私の答えのコメントをありがとう、それは多くの意味があります。いいキャッチ!あなたのために+1、良い先生。 – wsanville

2

ECMA-262のセクション9.2は、内部論理NOT演算子によって使用される抽象操作ToBooleanを定義します。それは言う:

文字列
引数が空の文字列(長さがゼロである)である場合、結果はfalseです。そうでない場合、結果は真です。

JavaScriptは、異なるデータ型のこれらの値を比較しようとすると型強制を実行します。ダグラス・クロフォードは、this is a misfeatureと言っています。 ==の代わりに===を使用した場合は間違いです。ルールはかなり複雑ですので、詳細はECMA-262の11.9.3節を直接参照してください。

関連する問題