parseIntの罠

最近、久しぶりにソース記述ミスによるバグではまったのでメモ。
文字列型をint型に変換するJavaでもお馴染みメソッドparseInt。
javascriptにてn月の翌月を算出するプログラムの中でparseIntを使用して発生した問題。

var i = (parseInt("200809".substr(4)) + 1) % 12;
alert(i);

あまりスマートな方法ではないですが、普通に見かけそうな記述です。
実行してみると、あら不思議「10」ではなく「1」になります。

問題はjavascriptのparseIntの解釈にあります。

parseInt(string, radix)
string:変換元文字列、radix:基数

第2引数を指定しないと第1引数の先頭文字によって基数が決定される。
"0"始まりの場合8進数、"0x"始まりの場合16進数とのこと。

つまり、parseInt("09")は8進数と見なされ「0」になってしまった模様です。

なので下記が正解です。

var i = (parseInt("200809".substr(4),10) + 1) % 12;
alert(i);


ちなみにJavaで同じようなコードをInteger#parseIntで行っても、
上記の現象は起こりません。