グローバルプロパティ undefined はプリミティブ値 undefined を表します。これは JavaScript におけるプリミティブ型の一つです。

undefined のプロパテイ属性
書込可能 不可
列挙可能 不可
設定可能 不可

構文

undefined

説明

undefined は、グローバルオブジェクトのプロパティであり、すなわちグローバルスコープ内の変数です。undefined の初期値はプリミティブ値 【訳注: オブジェクトでなく、メソッドも持っていない 1 個のデータからなる値のこと】 である undefined です。

モダンブラウザ (JavaScript 1.8.5 / Firefox 4 以降) での undefined は、ECMAScript 5 仕様により、設定不可、書き込み不可のプロパティとなっています。そうでない場合であっても、上書きは避けてください。

まだ値が代入されていない変数は undefined 型となります。また、評価されようとしている変数が代入値を持たない場合、メソッドや文は undefined を返します。return 文がなく値を返さない関数も 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) {
   // ここの文は実行される
}

if (x !== undefined) {
   // ここの文は実行されない
}

注記: ここでは、標準の等価演算子よりも厳格な等価演算子を使うべきです。なぜなら、厳格な等価演算子はそうしないのに、x == undefinedxnull かどうかも確認するからです。nullundefined と等しくありません。詳しくは、比較演算子を参照してください。

Typeof 演算子と undefined

代わりに、typeof が使えます。

var x;
if (typeof x === 'undefined') {
   // ここの文は実行される
}

typeof を使う理由の一つは、変数が宣言されていない場合、エラーが発生しないことです。

// 直前まで x は宣言されていない
if (typeof x === 'undefined') { // エラーなしで true と評価される
   // ここの文は実行される
}

if(x === undefined){ // ReferenceError が発生

}

いずれにしても、この種のテクニックは避けるべきです。JavaScript は静的スコープを持つ言語ですから、変数が宣言されているか知りたい場合、その変数が含まれるコンテキスト内で宣言されているか調べることで知ることができます。唯一の例外はグローバルスコープですが、グローバルスコープはグローバルオブジェクトと関連付けられているため、グローバルなコンテキスト内に変数が存在するか確認したければ、グローバルオブジェクト上のプロパティの存在を確認する (例えば in 演算子を使って) ことで行えます。

Void 演算子と undefined

3 つめの方法として、void 演算子があります。

var x;
if (x === void 0) {
   // ここの文は実行される
}

// 直前まで y は宣言されていない
if (y === void 0) {
   // ReferenceError が発生する (`typeof` とは対照的に)
}

仕様

仕様書 状況 コメント
ECMAScript 1st Edition (ECMA-262)
undefined の定義
標準 初期定義。JavaScript 1.3 にて実装。
ECMAScript 5.1 (ECMA-262)
undefined の定義
標準
ECMAScript 2015 (6th Edition, ECMA-262)
undefined の定義
標準
ECMAScript 2017 Draft (ECMA-262)
undefined の定義
ドラフト

ブラウザの実装状況

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari
基本サポート (有) (有) (有) (有) (有)
機能 Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
基本サポート (有) (有) (有) (有) (有) (有)

ドキュメントのタグと貢献者

タグ: 
 このページの貢献者: Marsf, x2357, teoli, ethertank, Potappo, Yukoba, Mgjbot, Yuichirou
 最終更新者: Marsf,