How can I test for an empty JavaScript object?
After an AJAX request, my application sometimes returns an empty object like:
var a = {};
What are the best methods to check if a JavaScript object is empty?
The most reliable way to test for an empty JavaScript object is using Object.keys(obj).length === 0, which returns true only when the object has no enumerable properties. For a more comprehensive check that includes non-enumerable properties, you can use Object.getOwnPropertyNames(obj).length === 0. These methods work perfectly for empty objects like {} and are the recommended approaches in modern JavaScript development.
Contents
- Using Object.keys() Method
- Using Object.getOwnPropertyNames() Method
- Using for…in Loop
- Using Utility Libraries
- Performance Comparison
- Complete Empty Object Check
- Handling Special Cases
Using Object.keys() Method
The most common and straightforward method to check if an object is empty in JavaScript is by using the Object.keys() method. This static method returns an array of a given object’s own enumerable property names.
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
// Examples
console.log(isEmpty({})); // true
console.log(isEmpty({name: "John"})); // false
console.log(isEmpty({0: "zero"})); // false
As the Mozilla Developer Network explains, Object.keys() returns an array whose elements are strings corresponding to the enumerable properties found directly upon the object. When the object is empty, this array will have a length of 0, making it an efficient way to check for emptiness.
This method is particularly useful because it’s concise, easy to read, and performs well in modern JavaScript engines. The Built In article confirms that this is typically the easiest way to determine if an object is empty.
Using Object.getOwnPropertyNames() Method
For a more thorough check that includes non-enumerable properties, you can use Object.getOwnPropertyNames(). This method returns an array of all properties found directly on the object, regardless of their enumerability.
function isEmptyComplete(obj) {
return Object.getOwnPropertyNames(obj).length === 0;
}
// Examples
const obj1 = {};
console.log(isEmptyComplete(obj1)); // true
const obj2 = Object.defineProperty({}, "hidden", {
value: "secret",
enumerable: false
});
console.log(isEmptyComplete(obj2)); // false - detects non-enumerable property
According to Flexiple, Object.getOwnPropertyNames() is superior when a full assessment of the object’s properties is required because it captures all properties, including those that are not enumerable. The Stack Overflow discussion also highlights that this method provides a more comprehensive empty check than Object.keys().
The difference between these methods becomes important when dealing with objects that have non-enumerable properties, which won’t be detected by Object.keys() but will be caught by Object.getOwnPropertyNames().
Using for…in Loop
Another approach is to use a for...in loop to iterate through the object’s properties. This method checks for enumerable properties, including those from the object’s prototype chain.
function isEmptyForIn(obj) {
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
return false;
}
}
return true;
}
// More concise version
function isEmptyForInConcise(obj) {
for (let key in obj) {
return false;
}
return true;
}
The DEV Community explains that a for…in loop iterates over the enumerable properties of an object and returns each property name. When checking for emptiness, if the loop executes even once, the object is not empty.
As noted by Stack Overflow, this approach can be more memory-efficient than Object.keys() because it doesn’t create an intermediate array of all keys. However, it’s important to use hasOwnProperty() or similar checks to avoid counting inherited properties.
Using Utility Libraries
If you’re already using JavaScript utility libraries like jQuery or Lodash, they provide convenient methods for checking object emptiness.
jQuery.isEmptyObject()
// Requires jQuery library
if ($.isEmptyObject(obj)) {
// Object is empty
}
Lodash _.isEmpty()
// Requires Lodash library
if (_.isEmpty(obj)) {
// Object is empty
}
According to the Stack Overflow discussion, these utility methods are optimized and handle various edge cases. However, they do add external dependencies, so for a simple empty check, native JavaScript methods are usually preferred unless you’re already using these libraries in your project.
Performance Comparison
When choosing a method, performance is an important consideration, especially if you’re performing emptiness checks frequently or on large objects.
Performance Results
Based on the research findings:
- for…in loop tends to perform better in many cases, especially when you break early on finding the first property
- Object.keys() performs really well, particularly in Chrome and other modern browsers
- Object.getOwnPropertyNames() is slightly slower but provides more comprehensive checking
The Tomek Kolasa article indicates that methods using a for-in loop tend to perform better. The ES6 object empty check method using Object.getOwnPropertyNames() function performed better than others in some tests.
Memory Efficiency
Object.keys()creates an intermediate array of all keys, which can be memory-intensive for large objectsfor...inloop with early termination is more memory-efficient as it doesn’t create the arrayObject.getOwnPropertyNames()also creates an array but checks more properties
For most practical purposes, the performance differences are negligible unless you’re performing hundreds of thousands of checks per second.
Complete Empty Object Check
For a truly comprehensive empty object check that accounts for all types of properties (including Symbol keys and non-enumerable properties), you can combine multiple methods:
function isCompletelyEmpty(obj) {
// Check for own enumerable properties
if (Object.keys(obj).length > 0) return false;
// Check for own non-enumerable properties
if (Object.getOwnPropertyNames(obj).length > 0) return false;
// Check for Symbol properties
if (Object.getOwnPropertySymbols(obj).length > 0) return false;
return true;
}
// More concise version
function isCompletelyEmptyConcise(obj) {
return !Object.getOwnPropertySymbols(obj).length &&
!Object.getOwnPropertyNames(obj).length;
}
As mentioned in the Coderwall discussion, this approach ensures you catch all types of properties that might make an object non-empty.
Handling Special Cases
When checking for empty objects, it’s important to consider some special cases:
Objects with Symbol Keys
const obj = { [Symbol('id')]: 123 };
console.log(Object.keys(obj).length === 0); // true - misses Symbol keys
console.log(Object.getOwnPropertySymbols(obj).length === 0); // false - detects Symbol
Objects with Prototype Properties
function MyClass() {}
MyClass.prototype.method = function() {};
const obj = new MyClass();
console.log(Object.keys(obj).length === 0); // true - only checks own properties
console.log(obj.hasOwnProperty('method')); // false - inherited property
Null and Undefined
function safeIsEmpty(obj) {
return obj && Object.keys(obj).length === 0;
}
// These would throw TypeError with direct Object.keys()
console.log(safeIsEmpty(null)); // false
console.log(safeIsEmpty(undefined)); // false
The Mozilla documentation warns that undefined and null cannot be coerced to objects and will throw a TypeError. Always handle these cases when working with potentially undefined input.
Conclusion
Key Takeaways
- Object.keys(obj).length === 0 is the most common and efficient method for checking empty objects with enumerable properties
- Object.getOwnPropertyNames(obj).length === 0 provides a more thorough check that includes non-enumerable properties
- for…in loop with early termination can be more memory-efficient but requires careful handling of inherited properties
- For comprehensive checking, combine methods to catch all property types including Symbol keys
- Always handle null and undefined cases to avoid runtime errors
Recommendations
- For most use cases,
Object.keys(obj).length === 0is the best choice - it’s readable, performant, and covers the most common scenario - If you need to detect non-enumerable properties, use
Object.getOwnPropertyNames(obj).length === 0 - Avoid
for...inloops for empty checks unless you have specific performance requirements - Consider utility libraries like Lodash if you’re already using them in your project
Related Questions
- How do I check for empty arrays in JavaScript? Use
Array.isArray(arr) && arr.length === 0 - What’s the difference between enumerable and non-enumerable properties? Non-enumerable properties don’t appear in
for...inloops orObject.keys()but can still be accessed directly - Should I use
for...inorObject.keys()for iteration?Object.keys()is generally preferred as it doesn’t include inherited properties and is more predictable
Next Steps
Experiment with these methods in your codebase to see which one fits your specific needs. Consider creating a utility function that handles all the edge cases if you need robust empty checking throughout your application.
Sources
- How do I test for an empty JavaScript object? - Stack Overflow
- How to Check if an Object is Empty in JavaScript – JS Java isEmpty Equivalent - Flexiple
- How to Check If an Object Is Empty in JavaScript | Built In
- 7 Easy Ways To Check If An Object Is Empty In JavaScript - DEV Community
- How to check if JavaScript Object is empty - W3Docs
- How to check if JavaScript Object is empty (Example) - Coderwall
- How to Check if Object is Empty in JavaScript - Fjolt
- How to Check if an Object is Empty in JavaScript - Scaler Topics
- How to check if an object is empty in JavaScript - AltCademy
- JavaScript: Check if an Object is Empty - Stack Abuse