【JavaScript】 (0 < n < 10) のように比較演算子をつないで使えないのはなぜ?

Sponsored Link

img_javascript

JavaScriptでif文などを使って条件分岐させる時の話なのですが、条件に(0 < n < 10) のように比較演算子を2つつないで使うことはできません。

なぜでしょうか?例えば次のようなスクリプトを実行します。

<script>
var n =5;
if(0 < n < 10)
  alert(n + "は正解です。");
else
  alert(n + "は不正解です。");
</script>

実行結果は以下のようになり、スクリプトには問題がなさそうな気がします。

javascript実行結果画像1

では変数nの値を20に変えてスクリプトを実行してみます。結果は以下のようになります。

javascript実行結果画像2

変数nに代入した20はif文の条件に指定した「0より大きく10より小さい」にはもちろん当てはまらないのに「20は正解です。」と表示されています。おかしいですね。

さらに変数nの値を“hubworks”に変えて実行してみます。あれ!エラーとならず、「hubworksは正解です。」と表示されました。

javascript実行結果画像3

なぜこうような実行結果になるの?

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つつないで使うことはできない理由は理解できましたでしょうか? 異なる型の演算における型変換のルールをしっかり理解していないとこのような間違いが起こります。 この型変換のルールを簡単にまとめて終わりとします。

異なる型の演算における型変換のルール

・数値と文字列の演算は文字列
・数値と真偽値の演算は数値
・文字列と真偽値の演算は文字列
・数値どうしの演算は基本的に実数

関連記事

福岡のウェブデザイン事務所「ハブワークス」

HP作成・リニューアルは福岡のハブワークスまでお気軽にお問い合わせください。ウェブサイト公開後の修正・更新もお任せください。フリーランスだからできるリーズナブルな料金設定でサービスをご提供いたします。