🙆

JavaScriptでObjectの空判定

2021/05/06に公開4

ふと Object の空判定ってどうやるんだっけと思ったので書き留めておきます。

Object の空判定

空 Object と比較すればいいんじゃなかったっけと思ってたんですが、このやり方では比較結果は false になります。

const obj = {};
console.log(obj === {}); // false

何故かというと、等価演算子は左辺と右辺両方のオペランドが Object である場合は同じオブジェクトを参照している場合にのみ true を返すようになっています。

両方のオペランドがオブジェクトである場合、同じオブジェクトを指している場合に限り true を返します。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Strict_equality

そのため以下のように Object.keyslength が 0 がどうか検証する必要があります。

const emptyObj = {};
const isEmpty = Object.keys(emptyObj).length === 0 && emptyObj.constructor === Object;

console.log(isEmpty); // true

ここで constructor の Object 判定を合わせて行っている理由ですが、 new Date() などの場合も keyslength が 0 になり不十分な判定となるためです。

Discussion

standard softwarestandard software

Object.keysで判定するのはとてもわかりやすいです。

Date型なのか普通のオブジェクトなのかの判定にはいろいろありすぎるので、ご参考程度にどうぞです。
https://github.com/standard-software/partsjs/blob/master/source/type/isType.js#L83
isDateとか、isObjectとかの別関数の判定を使っていた方がいいと思います。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/create
Object.create(null) とかで、constructor を持たないオブジェクトを作れたりするのでお気をつけください。

kyokyo

こちらですが、Object.keys()ではキーがSymbolの場合値を取得できないため、Reflect.ownKeys()を用いた方がいいかもしれないです。

参考: https://ja.javascript.info/keys-values-entries

var obj =  {
    a: "a",
    [Symbol("b")]: "b"
}
Object.keys(obj)  // → ['a']
Reflect.ownKeys(obj)  // → ['a', Symbol(b)]
hakshuhakshu

Symbolについて考慮できてなかったです。情報ありがとうございます。