When to Use Lodash stubObject in JavaScript
Lodash's _.stubObject is a utility method that returns a
new, empty plain object every time it is called. While returning
{} might seem trivial, this method serves critical roles in
functional programming patterns, default callback handling, and testing
by guaranteeing a fresh object reference on every invocation. This
article breaks down exactly when and why developers should use
_.stubObject in their JavaScript applications.
1. Preventing Unintended Shared References
A common bug in JavaScript occurs when developers provide a static object literal as a default value or initializer across multiple iterations:
// Problematic: Every element references the EXACT same object in memory
const items = _.times(3, _.constant({}));
items[0].id = 1;
console.log(items[1].id); // 1 (Mutated across all instances)
// Correct: Generates a distinct object instance for each element
const safeItems = _.times(3, _.stubObject);
safeItems[0].id = 1;
console.log(safeItems[1].id); // undefinedWhenever you need a factory function that generates isolated empty
objects without writing an inline wrapper like
() => ({}), _.stubObject is the idiomatic
choice.
2. Default Callbacks in Functional Pipelines
When working with conditional utilities such as _.cond,
developers often need a predictable fallback function.
_.stubObject acts as a clean, standardized default case
that guarantees an object return type:
const parsePayload = _.cond([
[isValidUser, getUserData],
[isValidOrder, getOrderData],
[_.stubTrue, _.stubObject] // Fallback: returns an empty object instead of null/undefined
]);Using _.stubObject here avoids
TypeError: Cannot read properties of undefined later in the
pipeline by ensuring downstream consumers always receive an object.
3. Unit Testing and Mocking
In automated test suites, stubbing external dependencies or callback
arguments often requires returning dummy objects. Using
_.stubObject signals intent clearly and removes
boilerplate:
// Jest mock example
const fetchMetadata = jest.fn(_.stubObject);
test('handles empty metadata correctly', () => {
const result = processService(fetchMetadata);
expect(result).toBeDefined();
});4. Code Readability and Declarative Style
While modern JavaScript allows arrow functions like
() => ({}), they are prone to subtle syntax errors (such
as forgetting the wrapping parentheses around the curly braces) and
create ad-hoc function instances inside rendering loops or recurring
executions. _.stubObject provides a named, reusable
function reference that clearly declares intent.