JavaScriptの条件を(1<=n<=10)とすると、nがどんな値でもtrueになる

今、学生時代にPythonをよく利用していたという新人に、JavaScript(というよりもVue.js)で課題をだしてプログラムを作ってもらっているのですが、その時に下記のような記述をしていました。

if(1 <= n <= 10){
  //略
}

どうやら、Pythonではこういう記述ができるそうです(参考:Pythonでは範囲条件を「a <= value < b」と書ける - Qiita)。Pythonはほとんど書いたことがないので知りませんでした。こういう書き方ができると、記述も少ないし、直観的だし便利かもしれないですね。
ひとまず、JavaScriptではこんな条件を書けないから、「1 <= n && n <= 10」と書かないといけないよと伝えておきました。

ただ、エラーはでていないようなので、この条件は何かしらの評価はされているはずと思い、試しにnの値をいろいろ変更して試してみました。
まずは普通にnを1とすると「true」、10とすると「true」。ここまでは予想通り。ただ、nを11としても「true」となったので直観とは反しています。じゃあ逆に下限より下の-1とするとどうなるんだと思ったら、これまた「true」。もしかしてと思い、数値以外の値を試してみても全て「true」になりました。

const rangeCondition = (n) => (1 <= n <= 10);

console.log(rangeCondition(1)); // true
console.log(rangeCondition(10)); // true
console.log(rangeCondition(-1)); // true
console.log(rangeCondition(11)); // true
console.log(rangeCondition(NaN)); // true
console.log(rangeCondition("aiueo")); // true
console.log(rangeCondition(null)); // true
console.log(rangeCondition(undefined)); // true

一瞬、「何で?」と思ったのですが、落ち着いて考えると分かりました。

「1 <= n <= 10」の評価を行う際、まずは左側の「1 <= n」が評価されます。この結果は、falseかtrueになります。
ということは、その後に「false <= 10」か「true <= 10」が評価されるわけですが、小なりや大なりを使った比較においてfalseやtrueを使うと、それぞれ0と1に変換されます。そのため、上記の評価は「0 <= 10」もしくは「1 <= 10」と同じ意味になり、どちらでも結果はtrueになるわけです。

そのため、条件が「-10 <= n <= -1」だと、全てfalseになります。

const rangeCondition = (n) => (-10 <= n <= -1);

console.log(rangeCondition(1)); // false
console.log(rangeCondition(10)); // false
console.log(rangeCondition(-1)); // false
console.log(rangeCondition(11)); // false
console.log(rangeCondition(NaN)); // false
console.log(rangeCondition("aiueo")); // false
console.log(rangeCondition(null)); // false
console.log(rangeCondition(undefined)); // false

コメント

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