JavaScriptのswitch文の条件は厳密か?

JavaScriptでの等価演算子は『==』と『===』の二種類があります。どう違うかというと、単純に説明すると『==』が自動的に型変換して比較してくれる等値演算子で、『===』は型も考慮して比較する同値演算子となります(参考:JavaScriptの等値演算子 (==) と同値演算子 (===) の比較)。
例えば以下の様な感じ。

上記のボタンは、クリックするとそれぞれの比較演算子の結果をアラートで表示するようにしたものです。『1==’1’』は『true』と表示され、『1===’1’』のほうは『false』と表示されます。
参考までに上記のボタンのソースコードは以下のようになっています。

<input type="button" value="1=='1'" onclick="alert(1=='1')"><input type="button" value="1==='1'" onclick="alert(1==='1')">

なお、『===』のほうを厳密な比較ということがあるようです。

ところで、条件文というとJavaScriptにはswtich文というものがあります。これは、switchで指定した式と一致するcaseのラベルの文を実行するという文ですが、はたしてこの時の比較は厳密かそうでないか。
では、下記のようなコードを書いて試してみます。

JavaScript

function switch_test(){
  switch(1){
    case '1':
      return '同値';
    default:
      return '厳密';
  }
}

HTML

<input type="button" value="switch" onclick="alert(switch_test())">

これで、ボタンをクリックすると、switch文が同値演算子と同じ動きであれば、”同値”と表示し、そうでないならば”厳密”と表示するアラートが表示されるはずです
以下が上記のコードで書いたボタンです。

クリックすると『厳密』と表示されました。よって、switch文の条件は厳密だということが分かりました。

最後に数値が書かれた文字列を数値型に変換するほうほうを説明します。
parseIntという関数を使って『parseInt(‘1′)』と書くのがある意味、基本なのですが、その他にも、『’1’-0』という方法があります。文字列は引き算できないので、自動的に引き算ができる数値に型変換されるわけです(参考:JavaScriptにおける数値⇔文字列の型変換あれこれ – console.lealog();)。
余談ですが、昔見た怖いコードの話。数値を引数としてとる関数がありました。仮にその引数をnumとしましょう。ですがそのコードを書いた人は、引数に文字列型が入ってしまう場合も考えたのでしょう。関数の最初の行は、下記のようになっていました。
『num = num + 0;』
思わず「うひゃっ」と声がでそうになりました。
これの何が怖いの? と思う人は、ブラウザの開発者ツールを開いて(大抵、F12キーを押すと開く)、コンソールモードにし、『num=’123′;num+0』と入力してエンターキーを押してみてください。
幸い、その引数に入るのは数値型の数値しかなかったのですが、すぐにコードを書いた人に伝えました。
まあ、自分も演算子を逆にしてしまうというバカな行動は日常茶飯事なので、人のことを言えた義理ではないのですが・・・。勘違いしやすいので気をつけましょう。

コメント

タイトルとURLをコピーしました