今、学生時代に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
コメント