JavaScript 言語のキーワードの null
は、値が存在しないことを表す特殊な値です。null
に対して typeof
演算子を使うと、"object"
という文字列が返されます。つまり、null
は、「オブジェクトが存在しない」ということを表す特別なオブジェクト値と見なされていることがわかります。しかし、実際には、null
は、null
というオブジェクト型の唯一のメンバーと見なされており、オブジェクトだけでなく、数値や文字列に対しても「値がない」ことを示すために使われます。ほとんどのプログラミング言語に、JavaScript の null
に相当するものが用意されています。null
や nil
などがそうです。
JavaScript には、値がないことを表す値がもう 1つあります。未定義( undefined
)値は、もう少し深い意味で、値が存在しないことを表します。初期化されていない変数の値や、存在しないオブジェクトプロパティや配列の要素を読み出した時の値が未定義値です。戻り値のない関数が返す値も未定義値です。関数の呼び出し時に値が指定されなかった、引数の値も未定義値です。undefined
は、予め定義されたグローバル変数です。未定義値に初期化されています。なお、null
とは異なり予約語ではありません。ECMAScript 3 では、undefined
は読み書き可能な変数ですので、値を変更できます。この問題は、ECMAScript 5 で修正され、undefined
は読み出しのみになっています。未定義値に対して typeof
演算子を使うと、未定義値を表す "undefined"
が返されます。
このような違いがあるにもかかわらず、null
と undefined
は両者とも値がないことを表すので、同一のものとして扱うことができます。等値演算子 ==
は両者を等しいと判定します(両者を区別したいときは、同値演算子 ===
を使ってください)。両者とも false
に変換される値です。論理値が必要な場所では、false
と同じように扱われます。null
も undefined
もプロパティやメソッドを持っていません。実際に .
や []
を使ってプロパティやメソッドにアクセスしようとすると TypeError
が発生します。
undefined
はシステムレベルで予期せぬ、ある意味エラーのような場合を表すもので、null
はプログラムレベルで予定どおりの場合を表すものと考えてもよいでしょう。両方のどちらかを変数やプロパティに値を設定したり、関数に値を渡したりしたい場合には、null
を使うようにしてください。