スタートページJavascript

undefined, null, ""(空白) の特徴と判別方法

undefined, null, "" の特徴を理解しないと思わぬトラブルが発生し、しかも、原因を特定しにくいことがあります。また、その判別も案外複雑です。ここではそれを整理して、関数 chekuType(変数, タイプ) を作成しました。


特殊タイプの特徴

ここでは、undefined, null, ""(空白)を「特殊タイプ」といいます。

ここでのデータ

ここでは次のデータ
   var x = [];
   x[0] = ""; x[1] = null; x[2] = undefined; x[3] = NaN; x[4] = 0; x[5] = "a";
を用います。

x[2] = undefined; を記述しないと undefined になります。
また、次のように記述できます。
   x = ["", null, , NaN, 0, "a"];
このとき、「,」だけの項は undefined になります。
しかし、x[2] = ; とすると文法エラーになります。

留意事項

これらの違いを理解していないと、思わぬトラブルが発生します。


特殊タイプの判別

基本的な判別機能

x が "" であるかを判別するには、if (x == "") のようにすればよいように思いますが、下表のように x=0 も含まれてしまいます。また、Javascript には isMaN(x) や typeof などの関数があります。しかし、次のように、単純にはいかないのです。

正しく識別するための記述

例えば、x が ””であり、null や undefined などではないことを判別するには、次の「条件」に示すような記述が必要になります。

関数 checkType(変数, タイプ)

上の条件式は複雑です。それでこれらを関数に自作しました。引数の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(変数) );
    };

checkTypeの使い方

変数xのタイプがtypeならば true を、そうでなければ false を戻します。
   if (checkType(x, "bu"))
では、x が "" あるいは undefind のときは true、そうでないときは faise を戻します。
次のような利用を想定しています。

いくつかの例を表示します。


特殊タイプと大小比較

変数タイプと大小比較

変数のタイプには、数値、文字列、""、null、undefined などがあります。
それらを単純に大小比較すると、次の表のようになります。
x,y の軸の空白は "" です。★は大小の比較ができないという意味です。

関数 compareType(x,y [, "top"|"bottom"])

任意の2変数の比較をする場合、それらのタイプが不明なことがあります。特に配列のソートなどをするときには特殊タイプとの比較、文字列と数値との比較が発生することがあります。そのとき、★の組み合わせになり、処理が異常終了するのが不都合なこともあります。

それを避けるために 関数 compareType() を作成しました。
オプションを省略あるいは"bottom" のときは
   (小)数値<文字列<""<null<undefined(大)
"top" のときは.
   (小)undefined<null<""<数値<文字列(大)
の大小関係になります。
戻り値は ">", "=", "<" のいずれかになります。

(オプション省略時)

念のため xをbnu= "bottom"/"top" でソートすると次のようになります。