2013年7月24日水曜日

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

みなさん!XPages開発していますか!?
さて今回は型変換の続きで、文字や日付型から数値への型変換を書いていきます。

数値型への型変換

文字列→数値

これについては、前々回でお話していますが、おさらいしておきましょう
  • JavaScriptのビルドイン関数にparseInt()がありますが、これは使わない
  • 代わりに Number() を使用する
  • 自動型変換を利用した方法でも良い (+"08")
ということでした。理由については、前々回の記事を参照してください。
ここで1つ注意。new Number() としてはダメです。下記のように不思議な現象が起きます。
var str = '08',
    num_a = Number(str),
    num_b = +str,
    num_c = new Number(str);
print(num_a); // 8
print(num_b); // 8
print(num_c); // 8 (chromeのconsoleで出せば Number{} と表示されます)
print(num_a === num_b); // true
print(num_a === num_c); // false ←?
じつは、new をつけると数値型ではなく数値オブジェクト型になるためです。数値はオブジェクトではなくプリミティブですが、new をつけると数値をラップしたオブジェクトになるため、数値とは異なるものになるからです。
ちょっと話が難しくなりましたね。今はわかんねーよという方は、とりあえずnew Number() を使わないようにしましょう。(勉強してわかるようになろうね!)
あ、下記も同じことが言えるので、使用禁止です。(前々回でやっとけばよかったねー)
// ダメな例
new String();
new Number();
new Boolean();
あれ? (1).toString() とかできるよね?プリミティブ値にはメンバー無いんじゃない? と思った方がいるかもしれません。実は、内部で暗黙的にオブジェクトに変換しているんですね。
(1).toString();
↓内部的には
(new Number(1)).toString();
として処理されます。便利ではあるんですが、ややこしさの一因にもなってますね(^^;

日付→数値

これは、Date.getTime()で変換する他ありません。前回「日付→文字列」でも書いた方法ですね。
こ れで得られる値は、タイムゾーンに関係なくUTCの1970/1/1 0時からの経過ミリ秒数で得られるので、日付型で保持できない(例えばプレーンなテキスト、JSONなど)場合にこの数値に変換して、使用するときには Data.setTime()で日付型に戻すと良いでしょう。

Boolean値の変換

Booleanはまとめたほうがわかりやすいかなと思い最後まとめました。

対数値

Booleanは、true -> 1、false -> 0 の関係にあり、それぞれ相互に変換されます。また、数値は0以外("以下"ではない!!)はtrue、0はfalseに変換されます。
print(Number(true)); // 1
print(Number(false)); // 0
print(Boolean(0)); // false
print(Boolean(1)); // true
print(Boolean(100)); // true
print(Boolean(-1)); // true
繰り返しになりますが、new Boolean() は使わないように。

対文字列

文字列は、空文字(長さが0の文字列)以外は、trueになります。
またBoolean値を文字列に変換すると、"true","false"になります。
・・・気づきました?
そう、false→文字列で"false"ですが、"false"→Booleanで true になってしまいます!
print(Boolean("a")); // true
print(Boolean("")); // false
var t = true,
    f = false,
    f_a;
print(String(t)); // "true"
f_a = String(f);
print(f_a); // "false"
print(Boolean(f_a)); // true

null と undefined

これらはBoolean型に変換すると、falseになります。
変数に値が割り当てられたかもしくはnullの場合は、処理しない・・・などどいうシーンでよく使用しますね。
var f = function(a, b){
    // !!は、自動型変換を利用した変換方法
    // ifの場合は()内を自動的に変換するため不要だが
    // 明示的に示すことで、意図を明確にできる。
    if(!!(a) && !!(b)){
        return 'o';
    }
    return 'x';
}
print(f("i")); // 'x' bがundefined
print(f(null, "i")); // 'x' aがnull
print(f("i", null)); // 'x' bがnull
print(f(1, "i")); // 'o'

型変換はおしまい

次は、JavaScriptのいろいろな実装パターンについて書いていこうかと思います。
海老原 賢次(EBIHARA Kenji)
リコーITソリューションズ株式会社(RICOH IT SOLUTIONS CO.,LTD.)
鹿児島ソリューション部(Kagoshima Department)

0 件のコメント:

コメントを投稿