空かどうかを調べる — 配列・オブジェクト・文字列

空の配列も空のオブジェクトも真なので、if (value) では判定できません。それぞれの正しい調べ方、null と空を分けるべき理由、1つの関数にまとめる形まで実行して確かめます。

実行して検証済み処理系Node 22.22.3対応ES2015難易度○○○○目安7更新

答え

種類ごとに見るところが違います。

種類 調べ方
配列 list.length === 0
文字列 text.length === 0
オブジェクト Object.keys(obj).length === 0
Map / Set map.size === 0
null / undefined value == null
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
true true true true true
javascript
console.log(Boolean([]));
console.log(Boolean({}));
console.log(Boolean(new Map()));
true true true

if (value) では判定できない

これがいちばんの落とし穴です。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
false false 0 false "" false null false undefined false null false
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
ある 空

空の配列も空のオブジェクトも「真」です。 オブジェクトはすべて真になり、中身は見られません。

偽になるのは、この6つだけです。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
1 0 0 1
javascript
console.log(JSON.stringify({ a: undefined }));
console.log(JSON.stringify({ a: undefined }) === '{}');
{} true

NaN は JSON にすると null と書かれます。ここでの最後の行は NaN の結果です。

だから if (list) は「配列があるか」しか見ていません。 中身が空かどうかは、別に調べる必要があります。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
読み込み中 該当なし 2件
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
true | null true | undefined true | true | [] true | [object Object] true | [object Map] false | 0 false | [1] false | [object Object]

オブジェクトの空判定で気をつけること

Object.keys() が数えるのは自分の・列挙できる・文字列の鍵だけです。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
null | ?? -> [] | || -> [] undefined | ?? -> [] | || -> [] [] | ?? -> [] | || -> [] 0 | ?? -> 0 | || -> [] "" | ?? -> "" | || -> []
javascript
const holed = [, ,];

console.log(holed.length);
console.log(holed.filter(() => true).length);
console.log(Object.keys(holed).length);
2 0 0
  • undefined が入っていても、鍵はある(空ではない)
  • 受け継いだ鍵は数えない
  • Symbol の鍵は数えない(あるのに空と判定される)

JSON.stringify() で見ると、また違う結果になります。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'name', 'tags', 'note' ]
javascript
const input = '   ';

console.log(input.length === 0);
console.log(input.trim().length === 0);
false true

鍵はあるのに {} と出ます。 JSON.stringify() での空判定は結果が変わるので使わないでください

Object.keys() / values() / entries()

null と「空」を分ける

この2つは、たいてい意味が違います。

状態 意味
null / undefined まだ来ていない・失敗した
[] / {} 来たが、0件だった

画面の出し分けで効いてきます。

この3つを1つにまとめると、読み手に嘘をつくことになります。 「読み込み中」と「0件」は、利用者にとって全く違う情報です。

分ける必要が無い場面もあります。そのときは list?.length を見れば、null も空も一度に扱えます。

まとめて判定する

種類が混ざるものを受けるなら、1つの関数にします。

0false は「空」ではありません。 値として入っています。 ここを空に含めると、0件と0という値を区別できなくなります。

空に倒すときの ??||

無いものを空配列にして進める書き方は便利ですが、演算子で結果が変わります。

配列を扱うだけなら差は出ませんが、0 や空文字が混ざる場所では変わります。 「無い」を空に倒すなら ??です。 → ?. と ??

穴だけの配列は「空」ではない

length は2ですが、要素は1つもありません。 length だけで判定すると、空なのに空でないと出ます

穴が混ざりうるなら、Object.keys(list).length を見てください。 → Array.from() / Array.of() / new Array()

入力欄の未入力をまとめて挙げる

count: 0 は未入力に含めていません。 0 は入力された値です。ここを混ぜると、0 を入れた人に「未入力です」と言うことになります。

空白だけの文字列

入力欄の値を見るときは、trim() してから長さを見てください。 → trim() / padStart() / padEnd() / repeat()

まとめ

  • if (value) では空を判定できない。 空の配列もオブジェクトも真
  • 配列と文字列は length、オブジェクトは Object.keys().lengthMap / Setsize
  • Object.keys()Symbol の鍵を数えない
  • JSON.stringify() で空判定をしないundefined の鍵が消える
  • null(来ていない)と [](0件)は分けて扱う
  • 空に倒すなら || ではなく ??
  • 穴だけの配列は length が0にならない
  • 入力欄は trim() してから長さを見る。0 を未入力に含めない

この記事の根拠

  1. Object.keys — ECMAScript® 2026 Language Specificationtc39.es
  2. ToBoolean — ECMAScript® 2026 Language Specificationtc39.es
  3. Object.keys() — MDNdeveloper.mozilla.org

掲載しているコード例は、公開前に読み手が押したときに動くのと同じもので実行して出力を突き合わせています。結果はリポジトリに残しています。

このページの原文(Markdown)