#概要
Java や C# ではオブジェクトが未定義な場合、null という値が返されます。JavaScript では普通は undefined が返されますが、null が返されるときもあり混乱します。
この undefined と null ですが、値としては同じもののようで、undefined == null を実行すると true になります。でも、当然ながら undefined === null は false です。
developer.mozilla.org によると、これらはグローバルオブジェクト (Global Objects) の値の一種だそうです。これらは次の4つです。
- Infinity (無限大)
- NaN (非数)
- undefined
- null (literal)
そして、undefined は値ですが、null はリテラルだそうです。初心者としては混乱しますね。
もし、C 言語を知っていれば、次のように解釈するとよさそうです。
- undefined は変数を宣言し、値を代入する前の状態 (メモリは確保したが、値は未確定)
- null は NULL というシンボル (0 が割り当てられている)
C だと変数を宣言して値を代入しないと、その変数の値は確定しませんが、JavaScript ではそのような状態に undefined という値を割り当てているという感じです。そして、その値は null と同じと評価するということで、自分的には解釈しています。
#判別
プログラミングで undefined と null を区別して評価するケースはあまりないものと思われますが、区別して評価するためには == でなく === を使う必要があります。
それ以外なら == で値を評価すればいいし、if 文のカッコ内に変数名だけ書いておけば判別できます。(この場合は空文字や 0 も null と同じに評価される)
// 厳密に undefined か評価するとき (null も同様)
if (a === undefined) {
// undefined のときの処理
}
// undefined でも null でもいいから緩く評価するとき
if (b == null) {
// undefined または null のときの処理
}
// 0 や '' も含めさらに緩く評価するとき
if (c) {
// 処理
}
#サンプル
'use strict';
/* グローバルにアクセス可能なビルトイン値。 */
/* undefined, null, NaN, Infinity */
var var1;
console.log(var1); // undefined (メモリだけ確保したが、初期化されていない)
var1 = null;
console.log(var1); // null (初期化されているが、型も値も決まっていない)
console.log(undefined == null); // true (同じ値とみなされる)
console.log(undefined === null); // false (値は同じでも別ものとみなされる)
var y = 1 / 0; // Infinity (無限大)
console.log(y);
var y0 = 0 / 0;
console.log(y0); // NaN (計算できない)
// null と表示される。
var1 = null;
if (var1) {
console.log('有効な値');
}
else {
console.log('null'); // こちら
}
// undefined と表示される。
var var2
if (var2) {
console.log('有効な値');
}
else {
console.log('undefined'); // こちら
}
if (var2 == null) {
console.log('null'); // var2 は undefined だが null と評価
}
else {
console.log('有効な値');
}
実行例
undefined
null
true
false
Infinity
NaN
null
undefined
null
※ JavaScript では 0 の割り算で例外が起こらなことに注意!
終わり