undefined, null, "" の特徴を理解しないと思わぬトラブルが発生し、しかも、原因を特定しにくいことがあります。また、その判別も案外複雑です。ここではそれを整理して、関数 chekuType(変数, タイプ) を作成しました。
ここでは、undefined, null, ""(空白)を「特殊タイプ」といいます。
ここでは次のデータ
var x = [];
x[0] = ""; x[1] = null; x[2] = undefined; x[3] = NaN; x[4] = 0; x[5] = "5"; x[6] = "a";
を用います。
x[2] = undefined; を記述しないと undefined になります。
また、次のように記述できます。
x = ["", null, , NaN, 0, "5", "a"];
このとき、「,」だけの項は undefined になります。
また、x[2] = ; とすると文法エラーになります。
これらの違いを理解していないと、思わぬトラブルが発生します。
x が "" であるかを判別するには、if (x == "") のようにすればよいように思いますが、下表のように x=0 も含まれてしまいます。また、Javascript には isMaN(x) や typeof などの関数があります。しかし、次のように、単純にはいかないのです。
例えば、x が ””であり、null や undefined などではないことを判別するには、次の「条件」に示すような記述が必要になります。
上の条件式は複雑です。それでこれらを関数に自作しました。引数のtypeは上表のtypeを見てください。
d(digital):null を含まない数値
s(string):""を含まない文字列
b(blank):""(空白)
n(null):null
u(undefined):undefined
このような関数は独立した関数にするよりも、それを使う関数の中に埋め込むほうが便利でしょう。それで関数変数にしました。これを呼び出す命令よりも先に記述してください。
var checkType = function(変数, タイプ) { if (タイプ == "u") return (変数 === undefined); if (タイプ == "b") return ( (変数 == '') && (typeof 変数 == 'string') ); if (タイプ == "n") return ( (変数 == null) && (typeof 変数 == 'object') ); if (タイプ == "bu") return ( (変数 === undefined) || (変数 == '') && (typeof 変数 == 'string') ); if (タイプ == "nu") return (変数 == null); if (タイプ == "bnu") return ( (変数 == null) || (変数 == '') && (typeof 変数 == 'string') ); if (タイプ == "s") return ( isNaN(変数) && (typeof 変数 == 'string') ); if (タイプ == "sb") return (typeof 変数 == 'string'); if (タイプ == "d") return ( (typeof 変数 == 'number') && !isNaN(変数) ); if (タイプ == "dn") return ( (typeof 変数 == 'object') || (typeof 変数 == 'number') && !isNaN(変数) ); };
変数xのタイプがtypeならば true を、そうでなければ false を戻します。
if (checkType(x, "bu"))
では、x が "" あるいは undefind のときは true、そうでないときは faise を戻します。
次のような利用を想定しています。
いくつかの例を表示します。
変数のタイプには、数値、文字列、""、null、undefined などがあります。
それらを単純に大小比較すると、次の表のようになります。
x,y の軸の空白は "" です。★は大小の比較ができないという意味です。
任意の2変数の比較をする場合、それらのタイプが不明なことがあります。特に配列のソートなどをするときには特殊タイプとの比較、文字列と数値との比較が発生することがあります。そのとき、★の組み合わせになり、処理が異常終了するのが不都合なこともあります。
それを避けるために 関数 compareType() を作成しました。
オプションを省略あるいは"bottom" のときは
(小)数値<文字列<""<null<undefined(大)
"top" のときは.
(小)undefined<null<""<数値<文字列(大)
の大小関係になります。
戻り値は ">", "=", "<" のいずれかになります。
念のため xをbnu= "bottom"/"top" でソートすると次のようになります。