undefined
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
グローバルの undefined
プロパティはプリミティブ値の undefined
を表します。これは JavaScript におけるプリミティブ型の一つです。
undefined のプロパティ属性 | |
---|---|
書込可能 | 不可 |
列挙可能 | 不可 |
設定可能 | 不可 |
試してみましょう
構文
undefined;
解説
undefined
は、グローバルオブジェクトのプロパティです。すなわちグローバルスコープ内の変数です。 undefined
の初期値はプリミティブ値である undefined
です。
最近のブラウザー (JavaScript 1.8.5 / Firefox 4 以降) での undefined
は、 ECMAScript 5 仕様により、設定不可、書込不可のプロパティとなります。 (そうでない場合でも、上書きは避けてください。)
まだ値が代入されていない変数は undefined
型となります。評価しようとしている変数に値が代入されていない場合、メソッドや文も undefined
を返します。値を return
しない関数も undefined
を返します。
メモ:
グローバルスコープ以外のスコープでは undefined
を識別子 (変数名) として使うことができますが (undefined
は予約語でないため)、コードの管理やデバッグが困難になるためおすすめできません。
//こんなことはしないこと!
// "foo string" をログ出力する
(function () {
var undefined = "foo";
console.log(undefined, typeof undefined);
})();
// "foo string" をログ出力する
(function (undefined) {
console.log(undefined, typeof undefined);
})("foo");
例
厳密等価と undefined
undefined
と厳密等価・非等価演算子を使って、変数に値があるか調べることができます。次のコードでは、変数 x
が定義されていないため、 if
文は true に評価されます。
var x;
if (x === undefined) {
// ここの文は実行される
} else {
// ここの文は実行されない
}
メモ:
ここでは、標準の等価演算子ではなく厳密等価演算子を使わないといけません。厳密等価演算子とは違い、 x == undefined
は、 x
が null
であるかどうかもチェックするからです。 null
は undefined
と等しくありません。
詳しくは、比較演算子を参照してください。
typeof 演算子と undefined
代わりに、 typeof
を使用することができます。
var x;
if (typeof x === "undefined") {
// ここの文は実行される
}
typeof
を使う理由の一つとして、こちらは変数が宣言されていなくてもエラーにはなりません。
// 直前まで x は宣言されていない
if (typeof x === "undefined") {
// エラーなしで true と評価される
// ここの文は実行される
}
if (x === undefined) {
// ReferenceError が発生
}
しかし、もう一つの選択肢があります。 JavaScript は静的にスコープされた言語なので、変数が宣言されているかどうかを知るには、それが含まれるコンテキストで宣言されているかどうかを見ることで読み取ることができます。
グローバルスコープはグローバルオブジェクトに結びつけられているので、グローバルコンテキストに変数が存在するかどうかのチェックは、グローバルオブジェクトにプロパティが存在することを、 in
演算子を使用してチェックすることで行うことができます。
if ("x" in window) {
// x がグローバルに定義されている場合のみ、ここの文を実行
}
void 演算子と undefined
3 つ目の方法として、void
演算子があります。
var x;
if (x === void 0) {
// ここの文は実行される
}
// 直前まで y は宣言されていない
if (y === void 0) {
// ReferenceError: y is not defined が発生
}
仕様書
Specification |
---|
ECMAScript Language Specification # sec-undefined |
ブラウザーの互換性
BCD tables only load in the browser