読者です 読者をやめる 読者になる 読者になる

ポジティブ心理学研究所

幸福度(EQ)アップの研究所です。ポジティブ心理学に出会う前の古い記事はネガティブなので注意。

本当にあった怖い話 Operaちゃん(12歳)のparseIntの仕様

先日公開したest47.js、いろいろと不具合もあったので修正して一安心も束の間、あらたな不具合を発見した時の世にも奇妙なお話。

それは旧OperaことOpera12で地図にオーバーマウスして確認していた時のこと、あれ?他の所は大丈夫なのになぜか北関東の特定2県だけ、挙動がおかしい。
なぜか、この2県へオーバーする直前にオーバーしていた県の名前を継承してしまう。

そしてクリックすると番号が0で返ってきていて、名前がundefined

f:id:lettuce0831:20140123224311p:plain

おいおい、おまえらは千葉県じゃない!
しかしなぜこの2県だけ???なにかあるのか?

とりあえずSVGのほうに不具合がないか見てみる

特に問題は見当たらない、きちんと数値参照用に埋め込んでいる数字にも問題はなかった。

Opera12で、数字をparseIntすると"08"と"09"だけが0で返ってくることが判明!

Operaのデバッグコンソールで実行し検証。

>>> parseInt("01")
1
>>> parseInt("02")
2
>>> parseInt("03")
3

うんうん、問題はないな。期待通りの動き。

>>> parseInt("04")
4
>>> parseInt("05")
5
>>> parseInt("06")
6
>>> parseInt("07")
7

うんうん、全然いいじゃん!おかしい挙動はないぞ^^

>>> parseInt("08")
0
>>> parseInt("09")
0

!!?

>>> parseInt("10")
10

!?

なぜ…、01〜07、10〜は正常なのに…、なぜ08と09だけ…
そりゃ、茨城県と栃木県の部分だけ挙動がおかしくなるはずだわ…、だって茨城県(08)と栃木県(09)だし…

困ったときのぐぐる先生

ここまではまだいいとして、"010"とか0から始まる数値(の文字列)が入ると、それを8進数として処理してしまう「ことがある」。ES3のparseIntの項にはこんな注釈がある。 http://myakura.hatenablog.com/entry/2012/01/25/235032

えーと、つまり、Opera12ちゃんは"0*"の数字を8進数として処理していたわけみたいです。 ということで、これを修正するためには以下のように第二引数で数字の基数を明示する必要があるらしいです。

>>> parseInt("08", 10)
8
>>> parseInt("09", 10)
9

ちゃんと修正したけど、Opera12は消え行くブラウザだから別にこのまま基数指定しなくてもいいか…、とか思ったのは内緒です。

というか、デフォルトで10進数にしとけや!

参考

今も世の中には

この仕様を知らずに原因不明のバグと戦っている人がいるんだろうなあ(遠い目)