Skip to content

Instantly share code, notes, and snippets.

@y-temp4
Created November 17, 2019 03:50
Show Gist options
  • Save y-temp4/268802eb14042af685c27e6b3b5a3a41 to your computer and use it in GitHub Desktop.
Save y-temp4/268802eb14042af685c27e6b3b5a3a41 to your computer and use it in GitHub Desktop.

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種類存在します。)

このような振る舞いを常に意識するのは大変ですし、コードの読み手も困惑する恐れがあるので、おとなしく===による比較を行ったほうが良いと思います。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment