2013年7月1日月曜日

連載:ちょっとディープなXPages 第2-2回~JavaScriptをもっと知ろう

みなさん!XPages開発していますか!? さて、今回は前回からの引き続きで、JavaScriptについて書いていきます。

JavaScript禁忌技(続き)

やるなよ、絶対にやるなよ。

parseInt()での数値変換は禁止

parseInt()は、文字列を数値に変換する便利な関数ですが、この関数の使用を十分理解していない場合、バグを生む原因にもなります。
IE8以降か、IE9以降のIE8モードで下記を実行してみてください。
alert(parseInt('07'));
alert(parseInt('08'));
"07"は"7"と表示されましたが、"08"は"0"が表示されました。おかしいですね?なんででしょう。
実は、parseIntには第2引数を渡すことができて、これは変換する進数の値です。
渡した文字列を16進数として扱いたい場合は、"16"を渡します。
alert(parseInt('0xFF'));
//→256 が表示される。
第2引数が渡されない場合は、文字列の内容によって進数が自動的に決定されるのですが、"0"で始まるものは8進数として処理しようとします。
よって、"08"は8進数として変換しようとしてしまいます。
しかし、"08"は8進数としては不正な文字列のため、(エラーになればいいのですが)0を返してしまいます。
最近のブラウザでは、"0x"で始まれば16進数、そうでない場合は10進数として処理するように仕様が変更されているので、この問題はおきません。XPagesのSSJSでも、同様です。
しかし、環境の違いを意識してコーディングするよりも、parseIntを禁止して別な手段を使ったほうが無難でしょう。
代わりに下記を使用します。
var str = '08',
    intStr1 = +str,
    intStr2 = Number(str);
console.log(intStr1); // -> 8
console.log(intStr2); // -> 8
parseIntと上記の代替例では、異なる点があります。
parseIntは数値で始まっていれば、数値以外の文字があっても数値に変換します。
一方代替例では、NaN となります。
var str = '123text',
    intStr0 = parseInt(str),
    intStr1 = +str,
    intStr2 = Number(str);
console.log(intStr0); // -> 123
console.log(intStr1); // -> NaN
console.log(intStr2); // -> NaN

まだまだつづくよ

今回は短いですが、このへんで。
次回もJavaScript。型変換についてもう少し説明します。

0 件のコメント:

コメントを投稿