How to Check if an Object is Empty in JavaScript

Mateen Kiani

Mateen Kiani

Published on Wed Jun 25 2025·5 min read

alt

How often have you stared at an object in JavaScript and wondered if it really held any data? We write functions that accept objects, return objects, and manipulate objects every day. Yet, a simple check—knowing whether an object is empty—can slip under the radar. Is using Object.keys the fastest way? Or does JSON.stringify offer a cleaner route? Let’s unpack these approaches.

By learning the pros and cons of each method, you’ll avoid bugs where empty objects sneak through your logic. Understanding how and when to verify object emptiness helps you write more reliable code, guard against unexpected edge cases, and make informed choices across your projects.

Why Check Object?

In JavaScript, objects are everywhere: configurations, API responses, state stores. An “empty” object—one without enumerable properties—often signals a missing value or an uninitialized state. If you don’t catch this early, your code might iterate over nothing, skip essential steps, or produce runaway errors.

Tip: Sometimes a function returning {} is still valid. Decide if “empty” means no keys or no values you care about.

Common scenarios:

  • API calls that return {} when no results are found
  • Configuration objects with defaults that you need to override
  • Form data submitted as an object, possibly missing fields

Without a reliable check, you’ll write workarounds that clutter your code. Next, we’ll explore the most common techniques.

Using Object.keys

The most widely used method involves Object.keys(). It returns an array of an object’s own enumerable property names. If that array’s length is zero, the object has no keys.

function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
console.log(isEmpty({})); // true
console.log(isEmpty({ a: 1 })); // false

Pros:

  • Built into JavaScript (no external libs)
  • Clear intent: checking the number of keys
  • Works on plain objects

Cons:

  • Doesn’t check non-enumerable or inherited properties
  • Slight memory overhead creating an array

Tip: If you need to ignore inherited props, stick with hasOwnProperty or Object.keys. For prototype chains, see Are JavaScript variables global.

JSON Stringify

Another quick trick is using JSON.stringify. Since {} serializes to "{}", you can compare against that string.

function isEmptyJSON(obj) {
return JSON.stringify(obj) === "{}";
}
console.log(isEmptyJSON({})); // true
console.log(isEmptyJSON({ a: 1 })); // false

Pros:

  • Handles nested empty objects: JSON.stringify({ a: {} })"{\"a\":{}}"
  • No array allocation for keys

Cons:

  • Slower for large objects (serialization costs CPU)
  • Doesn’t ignore inherited props or symbols

Remember, this only tests surface emptiness. For deep checks, you’ll need recursion or a utility library.

Iteration with for...in

You can use a for...in loop to detect the first enumerable key. Break immediately when you find one.

function isEmptyLoop(obj) {
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
return false;
}
}
return true;
}
console.log(isEmptyLoop({})); // true
console.log(isEmptyLoop({ b: 2 })); // false

Pros:

  • No temporary arrays or strings
  • Early exit on first key found

Cons:

  • Slightly more code to write
  • Must guard with hasOwnProperty to avoid prototype pollution

For callback-heavy code, you may also want to review What is a JavaScript callback. It helps structure logic around asynchronous checks.

Utility Libraries

Popular libraries like Lodash and Underscore include _.isEmpty, which covers objects, arrays, maps, and more.

import { isEmpty } from 'lodash';
console.log(isEmpty({})); // true
console.log(isEmpty([1,2])); // false
console.log(isEmpty('')); // true

Benefits:

  • Unified API for different data types
  • Well-tested, handles edge cases (Maps, Sets)
  • Saves you from writing repetitive code

Drawbacks:

  • Adds dependency bloat if you only need one helper
  • Learning curve if you’re not already using the library

Quick Tip: If you’re using modern frameworks, tree-shaking often eliminates unused parts of Lodash.

Performance Tips

When performance matters, test your methods. For small objects, Object.keys is almost always fastest. As objects grow:

  • Loop Exit Trick: for...in with immediate return can outpace array creation when the object has keys.
  • Microbenchmarks: Tools like jsPerf help measure in your target environment.

Example comparison on 1,000-key object:

MethodTime (ms)
Object.keys1.2
JSON.stringify4.8
for...in early exit0.9

Note: V8 optimization and browser versions affect results. Always benchmark if you care about milliseconds.

Common Pitfalls

  1. Ignoring Symbols: Object.keys skips symbol properties. Use Reflect.ownKeys if you care about them.
  2. Inherited Props: Always guard with hasOwnProperty in loops.
  3. Deep Emptiness: Nested objects may be empty but parent object isn’t. Write a recursive check if needed.
function isDeepEmpty(obj) {
if (isEmpty(obj)) return true;
for (let key in obj) {
if (!isDeepEmpty(obj[key])) return false;
}
return true;
}

For JSON data, understanding What is JavaScript Object Notation JSON ensures you handle strings, arrays, and objects correctly.

Conclusion

Checking if an object is empty might seem trivial at first glance, but it’s a core practice for robust JavaScript code. Whether you favor Object.keys, JSON serialization, for...in loops, or utility libraries like Lodash, each approach has its own trade-offs. Small objects favor Object.keys for clarity, while looping can shave milliseconds when performance is critical. Libraries add convenience but come with extra weight.

By understanding these methods and their caveats—handling symbols, inherited properties, or deep emptiness—you’ll prevent sneaky bugs and write cleaner logic. Next time you face an API that may return {}, or a config object that could be blank, you’ll know exactly how to test and handle it.

Ready to make your code bulletproof? Pick the method that fits your project’s needs and start guarding against empty-object edge cases today!


Mateen Kiani
Mateen Kiani
kiani.mateen012@gmail.com
I am a passionate Full stack developer with around 3 years of experience in MERN stack development and 1 year experience in blockchain application development. I have completed several projects in MERN stack, Nextjs and blockchain, including some NFT marketplaces. I have vast experience in Node js, Express, React and Redux.