JavaScriptのエンジン部分はブラウザ作ってる各社が勝手に実装しているのですが、
「ECMA TC39 委員会」という団体のECMAScriptで厳密な挙動の仕様が明記されており、
ECMAScriptを読めば型変換等のルールも明記してあるので探せば出てくるはずです。
しかし面倒くさいのでMDNの中で探します。
関係演算子セクション - MDN
これらの演算子はそれぞれ、比較前に各オペランドに対して valueOf()
関数を呼び出します。
JavaScript
1console.log(("").valueOf()); // ""
2console.log((5).valueOf()); // 5
はーつっかえ
まぁ、特殊なクラスのインスタンス同士でも、
valueOfメソッドを用意して絶対的な数値に変換出来るのであれば関係演算子で比較出来るよという趣旨の事が書いてあります。
しょうがないのでECMAScriptの仕様書を見に行きます。
11.8.5 The Abstract Relational Comparison Algorithm
If it is not the case that both Type(px) is String and Type(py) is String, then
Let nx be the result of calling ToNumber(px). Because px and py are primitive values evaluation order is not important.
Google翻訳使いながらの斜め読みですが、
どうやら比較対象がStringならばToNumberを行って比較するというルールになっているようです。
ToNumberとはなんぞや?
これはMDNに記述されていました。
== による緩い等価性 - MDN
この記述自体は==
のものですが、String型はToNumberを行うものとする。
ここでもToNumberが出てきました。
そして、そのロジックは(+値)
としたものと同様です。
JavaScript
1console.log(+""); // 0
2console.log(+"10"); // 10
3console.log(+"one"); // NaN
4console.log(+"10month"); // NaN
というわけで、比較演算子に""
が紛れ込んだ場合、数値の0として取り扱われます。
型変換を回避する良い方法を教えていただけると幸いです。
比較演算子は型変換を回避する方法はありません。
なので、そもそもそれが数値型ではなかった場合に処理を中断するようなコードの組み方にしましょう。
質問文のコードに応急手当てをするとこんな感じになるでしょう。
JavaScript
1if (typeof temperature === "number" && temperature < 25 && temperature > -5) {
2 // -処理-
3}
ただし、どう見ても数値の範囲絞り込みを行っている箇所なのに、
何故か空文字が混入してしまい、空文字と数値を比較し始めている時点でクソコードです。
なので源流の方を修正して、綺麗にフィルタリングしてせき止めるようにすることを推奨します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/11 05:00 編集
2019/03/11 05:06