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

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

構文

undefined

説明

undefined は、グローバルオブジェクトのプロパティであり、すなわちグローバルスコープ内の変数です。undefined の初期値はプリミティブ値である 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 == undefined は、 xnull かどうかもチェックするからです。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
基本サポート (有) (有) (有) (有) (有) (有)

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

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