グローバルプロパティ undefined はプリミティブ値 undefined を表します。これは JavaScript におけるプリミティブ型の一つです。
undefined のプロパティ属性 |
|
|---|---|
| 書込可能 | 不可 |
| 列挙可能 | 不可 |
| 設定可能 | 不可 |
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
構文
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 は、 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: y is not defined が発生する (`typeof` とは対照的に)
}
仕様
| 仕様書 | 状況 | コメント |
|---|---|---|
| ECMAScript 1st Edition (ECMA-262) undefined の定義 |
標準 | 初期定義。JavaScript 1.3 にて実装。 |
| ECMAScript 5.1 (ECMA-262) undefined の定義 |
標準 | |
| ECMAScript 2015 (6th Edition, ECMA-262) undefined の定義 |
標準 | |
| ECMAScript (ECMA-262) undefined の定義 |
現行の標準 |
ブラウザの実装状況
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
undefined | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 5.5 | Opera 完全対応 3 | Safari 完全対応 1 | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 10.1 | Safari iOS 完全対応 1 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
凡例
- 完全対応
- 完全対応