MENU

JavaScriptにおける`undefined`徹底解説:基礎から落とし穴まで

目次

undefinedとは何か

JavaScriptにおいてundefinedは「値が定義されていない状態」を表すプリミティブ型です。  

ECMAScript仕様では「未初期化の変数」や「存在しないプロパティにアクセスした結果」として返される特別な値と定義されています。

イティセル/コード専門官

わかりやすく言うと、undefinedは「値がまだ無いぞ!」というサインです。  

let x;
console.log(x);
リクナ / JavaScript統括官

undefined

実行結果
undefined →値が無いぞ
イティセル/コード専門官

ここでxは宣言されたものの、値が代入されていないためundefinedになります。

`undefined`が返る代表的なケース

1. 変数の未初期化

イティセル/コード専門官

よくあるあると思いますか何かの要素を代入しないとundefinedと返ってきます。

let a;
console.log(a);
リクナ / JavaScript統括官

undefined

実行結果
undefined

2. 存在しないオブジェクトプロパティ

イティセル/コード専門官

ageっていう変数がある。しかし、中身は空っぽで、しかも、中身が要素があるobjっていう要素とageと共に実行すると、objの中身は入っててもageが何も入ってないため、undefinedになります。

const obj = { name: "Taro" };
console.log(obj.age);
リクナ / JavaScript統括官

undefined

実行結果
undefined

3. 戻り値のない関数

イティセル/コード専門官

return 文が書かれていない場合、自動的に undefined を返します。  
そのため、関数を呼び出しても戻り値がないときには undefined が出力されます。

function greet() {
  console.log("Hello");
}
console.log(greet());
リクナ / JavaScript統括官

Hello
undefined

実行結果
Hello
undefined
イティセル/コード専門官

ここでは、関数の中で “Hello” が出力され、その後に戻り値として undefined が返っていることが分かります。 

イティセル/コード専門官

return を使えば、undefined は返らず、指定した値(Hello)だけが戻り値になります。

function greet() {
  return "Hello";
}
console.log(greet());
リクナ / JavaScript統括官

Hello

実行結果
Hello

4. 配列の空要素

イティセル/コード専門官

JavaScriptの配列は 0番目から始まる という特徴があります。  
例えば次のような配列を考えてみましょう。

この配列には3つの要素があるように見えますが、実際には次のような状態になっています。

arr[0] → 値は 1
arr[1] → 値が存在しない(空要素)
arr[2] → 値は 3

ここで arr[1] を参照すると、JavaScriptは「この位置には値が入っていない」と判断し、結果として undefined を返します。

const arr = [1, , 3];
console.log(arr[1]);
リクナ / JavaScript統括官

undefined

実行結果
undefined

`undefined`と`null`の違い

JavaScript初心者がよく混乱するのが、undefined と null の違いです。

イティセル/コード専門官

undefined  
「机の上に箱はあるけど、中身はまだ入っていない」状態。  
変数を宣言しただけで値を代入していないときや、存在しないプロパティを参照したときに返されます。
null  
「箱の中身をわざと空にしておいた(空っぽだと明示した)」状態。  
開発者が「ここには値が存在しない」と意図的に代入するときに使います。

let a;
let b = null;

console.log(a);
console.log(b);
リクナ / JavaScript統括官

undefined
null

実行結果
undefined
null

`undefined`と比較演算子

イティセル/コード専門官

==(抽象的等価演算子)
undefinednull は「どちらも値が存在しない」という点で扱いが似ているため、true になります。

===(厳密等価演算子)
undefinednull は型が異なるため、false になります。

console.log(undefined == null);
console.log(undefined === null);
リクナ / JavaScript統括官

true
false

実行結果
true
false

よくある落とし穴

`typeof`の結果

イティセル/コード専門官

typeofについては詳しく知りたい方は下のリンクを参考にしてください。

あわせて読みたい
【初心者向け】JavaScriptのtypeof入門|nullと配列の落とし穴を回避【ITTI】 typeofとは?JavaScriptの型を調べる基本 JavaScriptを学び始めると必ず出てくるのが typeof 演算子。 「typeofって何?」「nullや配列を判定するときに変な結果が出る...
イティセル/コード専門官

typeof undefinedundefinedと返ってきます。
しかし
typeof nullobjectとなります。

これは JavaScript が誕生した当初の仕様上のバグで、本来ならnullと返ってほしいところです。
ただし、既存のコードとの互換性を保つために修正されず、現在もそのまま残されています。
そのため、null を判定したい場合は typeof ではなく、=== null を使うようにしましょう。

イティセル/コード専門官

つまり、typeof undefinedundefined と返ってきます。  
しかし、typeof null は歴史的な仕様上のバグにより objectと返ってきます。  
よくある落とし穴です。

console.log(typeof undefined);
console.log(typeof null);
リクナ / JavaScript統括官

“undefined”
アッ…オッ…”object”…

実行結果
"undefined"
"object"

プロパティ存在チェック

イティセル/コード専門官

`obj.key === undefined`
obj に key プロパティは存在しません。  
存在しないプロパティを参照すると、自動的に undefined が返ります。  
そのため undefined === undefined となり、結果は true になります。
要するに、これは「値を取り出したら undefined だった」という判定であり、プロパティの有無までは確認していません。

`”key” in obj`
in 演算子は「そのプロパティが存在するかどうか」を調べます。  
今回の obj には key プロパティ自体が存在しないため、結果は false になります。
要するに、こちらは「プロパティそのものがあるかどうか」を確認する方法です。

イティセル/コード専門官

つまり「undefined が返るけど、プロパティ自体は存在しない」というのがよくある落とし穴です。

const obj = {};
console.log(obj.key === undefined);
console.log("key" in obj);
リクナ / JavaScript統括官

true
false

実行結果
true
false

`undefined`を安全に扱うテクニック

デフォルト値を設定する(Null合体演算子 `??`)

イティセル/コード専門官

?? は Nullish coalescing(ヌル合体演算子) と呼ばれます。
??は 「左側が null または undefined のときだけ、右側の値を使う」 という演算子です。  
つまり「値がなければデフォルトを使う」という安全な書き方ができます。

イメージとしては「ゲストがいなければ、代わりに用意した名前を使う」という感じです。

function greet(name) {
  name = name ?? "ゲスト";
  console.log(`こんにちは、${name}さん`);
}
greet();
リクナ / JavaScript統括官

こんにちは、ゲストさん

実行結果
こんにちはゲストさん

オプショナルチェイニング

イティセル/コード専門官

user は空オブジェクト {} なので、profile プロパティは存在しません。
そのまま user.profile.age と書くと、profile がないためエラーになります。
そこでオプショナルチェイニング演算子 ?. を使うと、途中で null undefined にぶつかった時点で、エラーを出さずに undefined を返すようになります。

要するに、?. は「存在するか分からないプロパティに安全にアクセスするための保険」です。
これを使うことで、実務でよくある「存在しないプロパティ参照によるエラー」を防ぐことができます。

const user = {};
console.log(user.profile?.age);
リクナ / JavaScript統括官

undefined

実行結果
undefinedエラーにならない

`undefined`と`void 0`

1. 昔の JavaScript

イティセル/コード専門官

初期の JavaScript では、undefined はただのグローバル変数でした。  
そのため、次のように再代入できてしまったのです。  

本来undefinedは「変数に値が設定されていない状態」を表す特別な値のはずですが、  
当時はなぜかそのundefined自体に別の値を代入できてしまいました。

undefined = 123;
console.log(undefined);
リクナ / JavaScript統括官

123

実行結果
123
イティセル/コード専門官

これでは「本来の undefined」を信用できなくなります。

2. そこで使われたのが `void 0`

イティセル/コード専門官

void 演算子は「式を評価して必ず undefined を返す」という性質があります。
つまり void 0 は常に undefined になります。
これを使えば、たとえ誰かが undefined を上書きしてしまっても、
安全に本来の undefined を得ることができました。

要するに、昔の JavaScript では「undefined を確実に参照したいなら void 0 を使え」というのが定番の書き方だったのです。

console.log(void 0);
リクナ / JavaScript統括官

undefined

実行結果
undefined
イティセル/コード専門官

現在のJavaScriptではundefinedは再代入できないため、通常はundefinedをそのまま使って問題ありません。

まとめ

JavaScript における undefined は、「まだ値が定義されていない状態」を示すサインです。  

変数を宣言しただけで値を入れていないとき、存在しないプロパティを参照したとき、戻り値のない関数を呼び出したときなど、さまざまな場面で自然に現れます。

null が「意図的に空にした値」であるのに対し、undefined は「まだ何も入っていない」という自然発生的な状態です。この違いを理解しておくと、コードの意図を正しく読み解けるようになります。

また、比較演算子や typeof の挙動には歴史的な仕様上のクセがあり、思わぬ落とし穴になることもあります。実務では Null合体演算子 ?? や オプショナルチェイニング ?. を活用することで、undefined を安全に扱うことができます。

かつては undefined が再代入可能だったため void 0 が使われていましたが、現在の JavaScript ではその必要はありません。

要するに、「undefined は JavaScript が『ここにはまだ値がないよ』と教えてくれるサイン」。これを押さえておけば、初心者がつまずきやすいポイントもクリアに理解できます。

もしこの記事が役に立ったと思ったら、シェアやコメントで教えてください。  

いただいた声を今後の改善に活かしていきます。  

最後まで読んでくださり、本当にありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ITTIのアバター ITTI 運営長

私はフロントエンドエンジニアを目指す初心者で、ITパスポートを取得済みです。現在はCopilotを活用しながらAIや最新のIT技術を学び、日本の開発現場で求められるチーム開発やセキュリティの知識を吸収しています。学んだことはコードや仕組みを整理し、わかりやすく発信することで、同じ学びの途中にいる人たちの力になりたいと考えています。

コメント

コメントする

目次