undefined

This article is in need of a technical review.

This article is in need of an editorial review.

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

Property attributes of undefined
書込可能 false
enumerable false
設定可能 false

構文

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 が使えます。

var x;

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

グローバルオブジェクトのプロパティとしての undefined は書き換えが可能であるため、正確にプリミティブ値の undefined を指定するには、void 0 などを使います。

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 2015 (6th Edition, ECMA-262)
The definition of 'undefined' in that specification.
Standard  
ECMAScript 5.1 (ECMA-262)
The definition of 'undefined' in that specification.
Standard  
ECMAScript 1st Edition (ECMA-262)
The definition of 'undefined' in that specification.
Standard 初期定義。JavaScript 1.3 にて実装。

ブラウザ互換性

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

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

タグ: 
Contributors to this page: x2357, teoli, ethertank, Potappo, Yukoba, Mgjbot, Yuichirou
最終更新者: x2357,
サイドバーを隠す