jakelizziのブログ

jakelizziの日常時々Techなブログです

JavaScriptのJSONオブジェクトが入った変数が、空かどうかの判定にめっちゃ時間かけちゃったという話

JSONオブジェクトの扱いについて

かなり初歩的な内容だが、業務中にしっかりつまずいた内容について記述して起きます。

やろうとしていたことは、JSONオブジェクトが入った変数が、空のオブジェクトなのか、何かしらの値が入ったオブジェクトなのかを比較することです。

コードの実行結果のキャプチャは paiza.io の実行結果を載せています。

JSにおけるFalsyの扱い。

先入観って怖いですね。普段そこまでしっかりJSを書いていなかったからか、 const a = {}falsy だと思っていた…しかし実際は falsy ではなくて、ちゃんとからのオブジェクトとして扱われます。
なので、当然ちゃ当然ですが下記のようなコードはずっと true になります。

const a = {};

if (a) { // 必ずtrue
    console.log('aは空オブジェクト');
} else {
    console.log('aは何かが入っているオブジェクト');
}

f:id:jakelizzi:20220211225658p:plain
結果1

参考

developer.mozilla.org

JSオブジェクトの比較について

上記の falsy における勘違いに気づいたので、なら比較してやればいいのか!と安直に思い、下記のようなコードを書いてしまいました。

const a = {};

if (a === {}) {
    console.log('aは空オブジェクト');
} else {
    console.log('aは何かが入っているオブジェクト');
}

f:id:jakelizzi:20220211225756p:plain
結果2

こんどの結果は、ずっと false です。

これはおそらくif文内の {} が別のJSONオブジェクトとして扱われたから…だと思います。(参考にしたQiitaなどの記事でそのように思いました。)
なので、当然 a{} は別のオブジェクトなのでそら false と判断されるということです。

じゃぁ、結局本当に比べたい場合はどうするの?となりますが、3パターンの方法があります。

  1. Object.keys() を使って key の数で比較
  2. for - in を使う
  3. 文字列にして比較

Chromeのバージョンによっては1の方法だと時間がかかる時があるそうなのですが、自分は1が一番完結でわかりやすいかなと思ったので、1の方法で修正しました。

const a = {};

if (Object.keys(a).length === 0) {
    console.log('aは空オブジェクト');
} else {
    console.log('aは何かが入っているオブジェクト');
}

f:id:jakelizzi:20220211225850p:plain
結果3

これでようやく、 a が空オブジェクトかどうかを判定することができるようになりました!
こんな初歩的な内容につまずいてしまい、それなりに時間を潰してしまった…思い込みって怖いですね。少しでも不安だったらちゃんと調べると参考のサイトのようにいっぱい情報は出ているので、それ見たほうが早かったです。
急がば回れですね。

参考

www.deep-rain.com

jsstudy.hatenablog.com

qiita.com