ちょっとハマらされたので自分用に覚書
JavaScriptのparseIntで期待している値が返らない
古いソースをメンテナンスしているとこういった問題にブチ当たることがある。
sample
var a="099";
var b="001";
if (parseInt(a) < parseInt(b)) {
// 真の場合の何某かの処理
} else {
// 偽の場合の何某かの処理
}
これは真になる。
なぜか。
parseIntに渡す数字の先頭が0(ゼロ)の場合、parseIntはその数字を8進として解釈しパースする。
つまり"099"とした場合、8進でパースしようとするのだが9は8進には存在しないので0になる。
"099"は0になってしまう1のである。
コード例でいくと 0 < 1 という比較になってしまうのである。
(本当は 99 < 1 の想定なのだが・・・)
テストくらいしてくれよOrz
まぁ、ちゃんと基数を与えなさいよってことだね。
sample
var a="099";
var b="001";
if (parseInt(a, 10) < parseInt(b, 10)) {
// 真の場合の何某かの処理
} else {
// 偽の場合の何某かの処理
}
誰やこのアプリ作ったヤツ(#゚Д゚) プンスコ!
-
ちなみにIE9以降はparseInt("099")としてもちゃんと99にパースされるようだ。だが古いWEBアプリ(主に見映え)を新しいIEに合わせて作りかえる予算をもらえない場合、苦肉の策として互換を利用することになる。互換設定をすると最新のIEで見ても古いIEで見ているような振る舞いをするのだが、JavaScriptの仕様まで古いまんまなのである・・・ ↩