JavaScriptではよく「==」ではなく「===」を使ったほうがいいと聞きますが、いまいち理由がわかっていなかった(なんか厳密になる?くらい)のでまとめました。
よく聞く「==は厳密な比較ができない」というのは、__引数の型__に問題があります。
JavaScriptでは暗黙の型変換がありますので、== による比較によって比較対象の型が意図しない方法で比較される恐れがあります。
Effective JavaScriptによると、==演算子によって強制的に引き起こされる振る舞いは以下のようになります。
引数の型(1) | 引数の型(2) | 強制 |
---|---|---|
null | undefined | なし(常にtrue) |
null または undefined | null でも undefinedでもない | なし(常にfalse) |
プリミティブ(文字列か数値かブール値) | Dateオブジェクト | プリミティブ=>数値、Date オブジェクト=>プリミティブ(先にtoStringを試し、次にvalueOfを試す) |
プリミティブ(文字列か数値かブール値) | Date 以外のオブジェクト | プリミティブ=>数値、Date 以外のオブジェクト=>プリミティブ(先にvalueOfを試し、次にtoStringを試す) |
プリミティブ(文字列か数値かブール値) | プリミティブ(文字列か数値かブール値) | プリミティブ=>数値 |
(引数の順序は問わない)
(プリミティブとはJavaScriptでオブジェクトではない値のことで、ブール値、数値、文字列、null、undefinedの5種類存在します。)
このような振る舞いを常に意識するのは大変ですし、コードの読み手も困惑する恐れがあるので、おとなしく===による比較を行ったほうが良いと思います。