undefined

グローバルのundefinedプロパティは、値が未定義であることを表します。これは、JavaScriptのプリミティブ型の1つです。

undefinedのプロパティ属性
書き込み可 ×
列挙可 ×
設定可 ×

文法

undefined

説明

undefinedはグローバルオブジェクトのプロパティで、グローバル空間の変数とも言えます。 undefinedの初期値は、プリミティブ値のundefinedになります。

モダンブラウザ(JavaScript 1.8.5)では、undefinedはECMAScript 5の仕様により、 設定不可、書き込み不可となります。 また、この制限が無いとしても、undefinedを上書きすることは避けるべきです。

値が割り当てられていない変数は、undefinedです。 メソッドまたはJavaScriptの記述も、評価されている変数に値が割り当てられていない場合、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) {
  //この箇所のコードが実行されます。
} else {
  //この箇所のコードは実行されません。
}

注意: ここでは、「通常の等式」の演算子では無く、「厳格な等式」の演算子を使用しなければいけません。 何故なら、x == undefinedはxがnullであるとも判定してしまうからです。 厳格な等式であれば、このような判定をしません。 nullはundefinedと等価ではありません。 詳細は、演算子の比較を参照してください。

typeof演算子とundefined

下記は、代わりにtypeofを使用した例です。

var x;
if (typeof x === 'undefined') {
   // この箇所のコードが実行されます。
}

typeofを使用する理由の1つに、 変数が定義されていなかったとしても、エラーがスローされないという点が挙げられます。

// xは事前に定義されていないとします。
if (typeof x === 'undefined') { // エラー無しでtrueと評価されます
   // この箇所のコードが実行されます。
}

if(x === undefined){ // ReferenceErrorがスローされます。

}

ただし、この種のテクニックは避けるべきです。 JavaScriptは静的スコープの言語で、閉じられたコンテキスト内で定義されたか否かを確認することで、 変数が定義されていれば読み込むことが可能です。(翻訳に自信なし) 唯一の例外はグローバル空間(スコープ)ですが、グローバル空間はグローバルオブジェクトにバインドされるため、 グローバルオブジェクト上のプロパティの存在を確認することで、グローバルコンテキスト内変数の存在を確認することが可能です。 (例えば、in演算子を使用する)

void演算子とundefined

void演算子は、第3の選択肢になります。

var x;
if (x === void 0) {
   // この箇所はコードが実行されます。
}

// yは事前に定義されていないとします。
if (y === void 0) {
   // ReferenceErrorをスロー('typeof'とは対照的に)
}

仕様

ブラウザ互換性

デスクトップ
機能 Chrome Firefox
(Gecko)
IE Opera Safari
基本
モバイル
機能 Android Chrome for
Android
Firefox
Mobile
IE
Mobile
Opera
Mobile
Safari
Mobile
基本

 Back to top

© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.

このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。

  • 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
  • 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
  • MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
  • "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。