undefined
Baseline
広く利用可能
この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2015年7月以降、すべてのブラウザーで利用可能です。
グローバルの undefined プロパティはプリミティブ値の undefined を表します。これは JavaScript におけるプリミティブ型の一つです。
試してみましょう
function test(t) {
if (t === undefined) {
return "Undefined value!";
}
return t;
}
let x;
console.log(test(x));
// 予想される結果: "Undefined value!"
値
プリミティブ値の undefined です。
undefined のプロパティ属性 | |
|---|---|
| 書込可能 | 不可 |
| 列挙可能 | 不可 |
| 設定可能 | 不可 |
解説
undefined は、グローバルオブジェクトのプロパティです。すなわちグローバルスコープ内の変数です。
古いブラウザーを除くすべてのブラウザーでは、 undefined は、設定不可、書込不可のプロパティとなります。 (そうでない場合でも、上書きは避けてください。)
まだ値が代入されていない変数は undefined 型となります。評価しようとしている変数に値が代入されていない場合、メソッドや文も undefined を返します。値を return しない関数も undefined を返します。
メモ:
グローバルスコープ以外のスコープでは undefined を識別子 (変数名) として使うことができますが (undefined は予約語でないため)、コードの管理やデバッグが困難になるためおすすめできません。
//こんなことはしないこと!
(() => {
const undefined = "foo";
console.log(undefined, typeof undefined); // foo string
})();
((undefined) => {
console.log(undefined, typeof undefined); // foo string
})("foo");
例
>厳密等価と undefined
undefined と厳密等価・非等価演算子を使って、変数に値があるか調べることができます。次のコードでは、変数 x が定義されていないため、 if 文は true に評価されます。
let x;
if (x === undefined) {
// ここの文は実行される
} else {
// ここの文は実行されない
}
メモ:
ここでは、標準の等価演算子ではなく厳密等価演算子を使わないといけません。厳密等価演算子とは違い、 x == undefined は、 x が null であるかどうかもチェックするからです。 null は undefined と等しくありません。
詳しくは、等価比較と同一性を参照してください。
typeof 演算子と undefined
代わりに、 typeof を使用することができます。
let x;
if (typeof x === "undefined") {
// ここの文は実行される
}
typeof を使う理由の一つとして、こちらは変数が宣言されていなくてもエラーにはなりません。
// 直前まで x は宣言されていない
// エラーなしで true と評価される
if (typeof x === "undefined") {
// ここの文は実行される
}
// ReferenceError が発生
if (x === undefined) {
}
しかし、もう一つの選択肢があります。 JavaScript は静的にスコープされた言語なので、変数が宣言されているかどうかを知るには、それが含まれるコンテキストで宣言されているかどうかを見ることで読み取ることができます。
グローバルスコープはグローバルオブジェクトに結びつけられているので、グローバルコンテキストに変数が存在するかどうかのチェックは、グローバルオブジェクトにプロパティが存在することを、 in 演算子を使用してチェックすることで行うことができます。
if ("x" in window) {
// x がグローバルに定義されている場合のみ、ここの文を実行
}
void 演算子と undefined
3 つ目の方法として、void 演算子があります。
let x;
if (x === void 0) {
// ここの文は実行される
}
// 直前まで y は宣言されていない
if (y === void 0) {
// ReferenceError: y is not defined が発生
}
仕様書
| 仕様書 |
|---|
| ECMAScript® 2027 Language Specification> # sec-undefined> |