🙆
JavaScriptでObjectの空判定
ふと Object の空判定ってどうやるんだっけと思ったので書き留めておきます。
Object の空判定
空 Object と比較すればいいんじゃなかったっけと思ってたんですが、このやり方では比較結果は false
になります。
const obj = {};
console.log(obj === {}); // false
何故かというと、等価演算子は左辺と右辺両方のオペランドが Object である場合は同じオブジェクトを参照している場合にのみ true
を返すようになっています。
両方のオペランドがオブジェクトである場合、同じオブジェクトを指している場合に限り true を返します。
そのため以下のように Object.keys
の length
が 0 がどうか検証する必要があります。
const emptyObj = {};
const isEmpty = Object.keys(emptyObj).length === 0 && emptyObj.constructor === Object;
console.log(isEmpty); // true
ここで constructor
の Object 判定を合わせて行っている理由ですが、 new Date()
などの場合も keys
の length
が 0 になり不十分な判定となるためです。
Discussion
Object.keysで判定するのはとてもわかりやすいです。
Date型なのか普通のオブジェクトなのかの判定にはいろいろありすぎるので、ご参考程度にどうぞです。
isDateとか、isObjectとかの別関数の判定を使っていた方がいいと思います。Object.create(null) とかで、constructor を持たないオブジェクトを作れたりするのでお気をつけください。
参考になります、ありがとうございます
こちらですが、Object.keys()ではキーがSymbolの場合値を取得できないため、Reflect.ownKeys()を用いた方がいいかもしれないです。
参考: https://ja.javascript.info/keys-values-entries
Symbolについて考慮できてなかったです。情報ありがとうございます。