JavaScript

null と undefined

 JavaScript 言語のキーワードの null は、値が存在しないことを表す特殊な値です。null に対して typeof 演算子を使うと、"object" という文字列が返されます。つまり、null は、「オブジェクトが存在しない」ということを表す特別なオブジェクト値と見なされていることがわかります。しかし、実際には、null は、null というオブジェクト型の唯一のメンバーと見なされており、オブジェクトだけでなく、数値や文字列に対しても「値がない」ことを示すために使われます。ほとんどのプログラミング言語に、JavaScript の null に相当するものが用意されています。nullnil などがそうです。

 JavaScript には、値がないことを表す値がもう 1つあります。未定義( undefined )値は、もう少し深い意味で、値が存在しないことを表します。初期化されていない変数の値や、存在しないオブジェクトプロパティや配列の要素を読み出した時の値が未定義値です。戻り値のない関数が返す値も未定義値です。関数の呼び出し時に値が指定されなかった、引数の値も未定義値です。undefined は、予め定義されたグローバル変数です。未定義値に初期化されています。なお、null とは異なり予約語ではありません。ECMAScript 3 では、undefined は読み書き可能な変数ですので、値を変更できます。この問題は、ECMAScript 5 で修正され、undefined は読み出しのみになっています。未定義値に対して typeof 演算子を使うと、未定義値を表す "undefined" が返されます。

 このような違いがあるにもかかわらず、nullundefined は両者とも値がないことを表すので、同一のものとして扱うことができます。等値演算子 == は両者を等しいと判定します(両者を区別したいときは、同値演算子 === を使ってください)。両者とも false に変換される値です。論理値が必要な場所では、false と同じように扱われます。nullundefined もプロパティやメソッドを持っていません。実際に .[] を使ってプロパティやメソッドにアクセスしようとすると TypeError が発生します。

 undefined はシステムレベルで予期せぬ、ある意味エラーのような場合を表すもので、null はプログラムレベルで予定どおりの場合を表すものと考えてもよいでしょう。両方のどちらかを変数やプロパティに値を設定したり、関数に値を渡したりしたい場合には、null を使うようにしてください。