こんな単純な関数にハマってしまった・・・忘れないようにメモメモ。
意外と気づかずに使っている人は多いんじゃなかろうか。
(たぶん、目立った問題は起きないんだろうなぁ・・・)
間違いがありましたらご指摘を。
ポイント:
JavaScript組み込み関数parseInt(string,radix)は、radix省略時はstringの内容により
radixを決定する。(しかも実装によって動作が変わる可能性がある。)
10進で解析したいときはparseInt(string,10)とすべき。
詳細:
parseInt関数を使ってプログラムを書いていると、radix省略時はradix=10として
解析しているように見えるが、ECMAScript Specにはradix省略時の動作として、
こんなことが書いてある。
If the length of S is at least 1 and the first character of S is "0", then at the implementation's
discretion either let R = 8 or leave R unchanged.
つまり、実装によっては"08"のような数字を与えると8進数扱いで解析をする可能性があると
いうこと。'8'は8進数の構成文字としてありえないので、そこで解析終了。結果は0になってしまう。
日付の処理をしていて、「1986/10/08」とかしたときになぜか「1986,10,0」と解析されちゃって
勘違いに気づいた。
日付とか、ゼロでフォーマットされる文字列を使っている場合は意外に多いので、
ハマってしまうことがあるのでは・・・?
ということで。