みんな大好きJavaScript。
そんなJavaScriptで罠にはまった話です。
プログラミングでは、型変換というのをよくやると思います。
文字を数値に、数値を文字に。。。
様々な言語でやりかたは違えど、必ず通る道のようなものです。
その日も僕はJavaScriptでせこせことWebアプリを作ってました。
いろいろな言語を時間単位で切り替えていたりすると、関数名なんて忘れてしまうもんです。
あんな役割の関数あったな。。。なんて思いながら実際の関数名をググるなんてのは日常茶飯事です。
(普通ばっちりと関数名を言語ごとに覚えてたりするのでしょうか。。。
文字列を数値にしたい。。。と思い、ググるとGoogle先生が優しく教えてくれました。
Google「parseIntって関数があるよ」
「あー、そうだった。。。」なんて思いながら僕は以下の様なコードを書きました。
1 |
var num = parseInt("0001"); |
実際のコードはもっと複雑で、引数の”0001”も動的なものでしたが、
parseIntの使い方はこんな感じでした。
実際にちゃんと動いてたので、 「よしよし」と思って先に進みました。
ここで完全に罠にはまってますね( ˘ω˘)
で、不具合が起きます。
どうやら上記でparseIntしてるところがおかしい。
引数に”0009″と入れると、numが”10”になります。
よくよくparseIntの仕様を見てみると、引数の文字列の頭が”0″の場合は
8進数として扱うと記載がありました。
まさに上の動きですね。
正しく動作させるためには
1 |
var num = parseInt("0009", 10); |
と第二引数に変換する数値の基数を渡す必要があったのです。
結果わかってしまえば関数を使う手段が間違ってたので罠というほどのものではなかったのですが、
これが厄介なのがブラウザ毎に動作異なるという点。
JavaScriptの実装が異なるので当然ではあるのですが、原因究明するのに少し手間取ってしまいました(^_^;)
あ、ちなみに僕はあまりJavaScript好きじゃありません。
Javaは好きです。