2014-01-10 3 views
6

このコードのほんの一部は気づかれるのに時間がかかりました。JavaScriptでdoubleと '=='が一致するのはなぜ真ではありませんか?

私は次のことを行うならば、それは

if('true' == true) { 
    alert("Does not happen"); 
} 

罰金だろう。しかし、それはもし条件に合格しないと思いました。

===という種類のジョブと一致するため、doubleが==の値と一致しないと考えました。

私の質問は、trueへの型キャストが'true'になった理由、またはこれらのオペランドのタイプをチェックする理由は何ですか?

+0

'true'は文字列です。 'true'はブール値です。つまり文字列== boolean –

答えて

8
'true' == true 

これは(rulesに応じて)ここに何が起こるかです:

- 数(ルール7)にブール値を変換します。

'true' == 1 

- ナンバーに '真' に変換(ルール5):

Number('true') == 1 

からNumber('true')NaNある:

NaN == 1 

- falseを返します(ルール1.c.ⅰ)

==は確かに紛らわしいですが、ルールを理解すれば、それはいくつかの意味があります:

  • ごみはごみ(未定義== nullのに等しい)
  • なしブール(これらは比較しているとして、数字)
  • 部品の一つが、部品の一つが文字列であれば、そうでない場合は、文字列
  • と比較
  • 数値を比較し、数であれば、AとBは同じものでなければなりません。
+2

これまで最高の(そして最も簡単な)説明! – musefan

4

Javascriptの==は、わかりにくいロジックの下で構築されている言語の最悪の部分の1つです...私たちは古い仕様に苦しんでいます、それは単なる答えです。

完全に手のひらを顔に当てるの戦利品を取る:編集

ため

https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Sameness

編集をうん、「型キャスト」は、我々が期待できるとして働いていません...何もありません/

+0

IMHO、これは質問に答えません。両方のオペランドの変換は仕様に従って_exactly_され、thg435の答えは受け入れられるべきです。 – Alnitak

4

rules for ==を参照してください。

Type(x)は文字列で、Type(y)はブール値です。したがって、ステップ7が適用されます。ブール値を数値に変換し、それを文字列と比較します。あなたが持っている文字列は、どの数字とも一致しません。

+0

私はこれがこのアルゴリズムの仕組みではないと思います。正しい手順の手順は7-5-1.c.iです。 – georg

+0

@ thg435 - Argh!そこにある 'Type(x)'のすべてで、 'Type(y)'を見逃しました。 – Quentin

1

JavaScriptブール値。引数がtrueの場合、結果は1です。引数がfalseの場合、結果は+0になります。だから、'true' == true'true' == 1に相当します。これはもちろん間違いです。

関連する問題