JavaScriptでif文などを使って条件分岐させる時の話なのですが、条件に(0 < n < 10) のように比較演算子を2つつないで使うことはできません。
なぜでしょうか?例えば次のようなスクリプトを実行します。
<script> var n =5; if(0 < n < 10) alert(n + "は正解です。"); else alert(n + "は不正解です。"); </script>
実行結果は以下のようになり、スクリプトには問題がなさそうな気がします。
では変数nの値を20に変えてスクリプトを実行してみます。結果は以下のようになります。
変数nに代入した20はif文の条件に指定した「0より大きく10より小さい」にはもちろん当てはまらないのに「20は正解です。」と表示されています。おかしいですね。
さらに変数nの値を“hubworks”に変えて実行してみます。あれ!エラーとならず、「hubworksは正解です。」と表示されました。
なぜこうような実行結果になるの?
JavaScriptで(0 < n < 10) のように比較演算子を2つつないで使うと、なぜこうような間違った実行結果になってしまうのでしょうか。 それは、暗黙のキャストが関係しています。
暗黙のキャストとは
暗黙のキャストとは異なる型どうしの演算を行う場合に、演算の前にどちらかの型に勝手にそろえることです。つまり暗黙のうちに型変換が行われるということです。
上記のスクリプトに書いた比較演算子(0 < n < 10)では、この暗黙のキャストが関係して、どのような処理が行われているかを説明します。 先ず、JavaScriptは前の比較演算(0 < N)を処理します。
処理の結果は比較演算ですから、trueもしくはfalseになります。
続いて、後の比較演算(N < 10)の処理に入るのですが、ここで暗黙のキャストが発生します。
比較演算の場合の暗黙のキャストでは、等号・不等号以外は数値に型変換されます。つまり、trueは1に、falseは0に型変換されているのです。
変数nに何を代入しても、結果的に1もしくは0が10より小さいかをチェックする条件式になってしまうので、処理の結果は必ずtrueになってしまうのです。
ですから、変数nの値を20や”hubworks”に変えても、エラーにはならず、全て正解です。という表示になってしまったわけです。
■さいごに
JavaScriptでは(0 < n < 10) のように比較演算子を2つつないで使うことはできない理由は理解できましたでしょうか? 異なる型の演算における型変換のルールをしっかり理解していないとこのような間違いが起こります。 この型変換のルールを簡単にまとめて終わりとします。
異なる型の演算における型変換のルール
・数値と文字列の演算は文字列
・数値と真偽値の演算は数値
・文字列と真偽値の演算は文字列
・数値どうしの演算は基本的に実数