依存してしまうと、Nullがオブジェクト型と認識されてしまい、値の「空」判定においては致命的になりかねない。ようなラッパーオブジェクトにも注意が必要だ。──では、注意点をおさえながら、実際に「空」判定のコードを書いてみる。期待値として、私が考える値の「空」の解釈の特筆すべき点は下記の通りだ。オブジェクト型については、プロパティがシンボルなどのプリミティブ値であっても、それを値をみなして「空」とはしない。ラッパーオブジェクトのオブジェクト型は、変換されるプリミティブ値にもとづいて「空」判定を行う。ネストするオブジェクトについては最終的なプリミティブ値まで再帰的に「空」判定を行う。シンボル型や関数オブジェクト型は、一律で「空」とはしない。──これらの「空」判定ルールに沿って作った関数がこれである。is_empty()この例では「is_empty」を無名関数として定義しているが、この場合、関数の巻き上げが行われないため、実際に「空」判定を行いたい処理より前にコードを書いておかないと実行できない。JavaScriptの読み込み順序などを気にせずに使いたい場合は、通常の関数宣言として記述しておくとよいだろう。true期待値通りの判定が行われている。参考までに、判定結果のテスト用コードも紹介しておく。});});まとめJavaScriptにおける値の「空」判定は、結局のところ各ユーザーの「空」の解釈によってブレがあるため、横断的に変数が「空」かどうかを判定するビルトインメソッドのようなものがないのだろう。それをユーザー関数でカバーしようとすると、JavaScriptの大雑把な「型」判定に悩まされることが分かった。実際には様々な型を有するオブジェクト型をどこまで切り出して「空」判定をするのかというポリシー的なものが大きいのではないだろうか。今回の「空」判定では、対象とするオブジェクト型を配列とオブジェクトとラッパーオブジェクトに限定してあるが、他にもDateやJSON、Error、RegExpなどのオブジェクトも存在するため、それらの「空」判定も行うとなるとその分関数処理が肥大化していくことになるだろう。結果的には、実用に耐えられそうな「空」判定関数が作成できたので、収穫は大きかったと云える。