グローバルプロパティ 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 == 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
演算子を使って) ことで行えます。
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 |
---|---|---|---|---|---|---|
基本サポート | (有) | (有) | (有) | (有) | (有) | (有) |