JavaScript ではオブジェクト型を処理することがとても多いですが、オブジェクトの空判定がちょっと面倒だったので、備忘録として記載します。
自分で utility として、 isEmpty とか isNotEmpty 関数を作っておくと重宝します。
{} === {} または null ではダメ
JavaScriptでは、オブジェクトの比較は参照によって行われます。
つまり、 {} は新しいオブジェクトリテラルを作成するたびに、異なるメモリアドレスを参照します。
そのため、{} === {} は常に false となり、オブジェクトの内容を比較することはできません。
また、オブジェクトが空の場合は {} として渡されていると null や undefined として扱われないです。
意外と、空判定は面倒です。
シンプルな書き方
Object.keys() を使うのがシンプルです。
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
console.log(isEmpty({})); // true
console.log(isEmpty({ key: 'value' })); // false
Object.keys() は、指定されたオブジェクトが持つプロパティの名前の配列を返すため、キーが一切ない場合に、空オブジェクトと判定するのがシンプルです。
凝った書き方
大半の場合は、先述の書き方(Object.keys() を使う書き方)で対応できます。
が、実はこれでは不完全です。
Object.keys() では、Symbol プロパティがキーの場合にはそのプロパティを取得できません。
Object.keys() は、オブジェクトの「列挙可能な文字列のプロパティのキー」だけを取得するため、Symbol プロパティがキーの場合は、Object.getOwnPropertySymbols() メソッドを使って取得する必要があります。
function isEmpty(obj) {
return Object.keys(obj).length === 0 && Object.getOwnPropertySymbols(obj).length === 0;
}
console.log(isEmpty({})); // true
console.log(isEmpty({ [Symbol('key')]: 'value' })); // false
オブジェクトが空かどうかを判定する際に、Symbol プロパティも考慮する必要がある場合は、ちょっと工夫が必要ですね。
とはいえ、そんな考慮は不要という場合もあると思うので、ケースバイケースですね。
参考
おわりに
よく使う関数の車輪の再発明は避けたいので、自社の汎用ユーティリティはアセットとして持っておきたいですね。


コメント