undefined

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

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

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

試してみましょう

構文

js
undefined;

解説

undefined は、グローバルオブジェクトのプロパティです。すなわちグローバルスコープ内の変数です。 undefined の初期値はプリミティブ値である undefined です。

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

まだ値が代入されていない変数は undefined 型となります。評価しようとしている変数に値が代入されていない場合、メソッドや文も undefined を返します。値を return しない関数も undefined を返します。

メモ: グローバルスコープ以外のスコープでは undefined識別子 (変数名) として使うことができますが (undefined予約語でないため)、コードの管理やデバッグが困難になるためおすすめできません。

js
//こんなことはしないこと!

// "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 に評価されます。

js
var x;
if (x === undefined) {
  // ここの文は実行される
} else {
  // ここの文は実行されない
}

メモ: ここでは、標準の等価演算子ではなく厳密等価演算子を使わないといけません。厳密等価演算子とは違い、 x == undefined は、 xnull であるかどうかもチェックするからです。 nullundefined と等しくありません。

詳しくは、比較演算子を参照してください。

typeof 演算子と undefined

代わりに、 typeof を使用することができます。

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

typeof を使う理由の一つとして、こちらは変数が宣言されていなくてもエラーにはなりません。

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

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

しかし、もう一つの選択肢があります。 JavaScript は静的にスコープされた言語なので、変数が宣言されているかどうかを知るには、それが含まれるコンテキストで宣言されているかどうかを見ることで読み取ることができます。

グローバルスコープはグローバルオブジェクトに結びつけられているので、グローバルコンテキストに変数が存在するかどうかのチェックは、グローバルオブジェクトにプロパティが存在することを、 in 演算子を使用してチェックすることで行うことができます。

js
if ("x" in window) {
  // x がグローバルに定義されている場合のみ、ここの文を実行
}

void 演算子と undefined

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

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

// 直前まで y は宣言されていない
if (y === void 0) {
  // ReferenceError: y is not defined が発生
}

仕様書

Specification
ECMAScript Language Specification
# sec-undefined

ブラウザーの互換性

BCD tables only load in the browser

関連情報