Lodash _.get: Handling Nullish Values in Chains
Lodash's _.get method provides a fail-safe mechanism for
retrieving deeply nested values in JavaScript objects without throwing
runtime errors. When traversing a path where intermediate properties are
null or undefined, the function safely
short-circuits the evaluation and either returns undefined
or a user-defined fallback value. This article explains the internal
mechanics of how _.get parses paths, navigates object
graphs, and gracefully terminates evaluation upon encountering nullish
values.
The Problem with Native Traversal
In standard JavaScript prior to optional chaining, traversing an
object path like user.profile.address.city when
profile is null or undefined
triggers an uncaught exception:
// Throws: TypeError: Cannot read properties of undefined (reading 'address')
const city = user.profile.address.city;Handling this natively required verbose guard clauses or deeply nested ternary operations.
Internal Path Normalization
When you invoke _.get(object, path, defaultValue), the
method begins by standardizing the property path. Lodash accepts paths
formatted as dot-notation strings ('a.b.c'),
bracket-notation strings ('a[0].b'), or arrays of keys
(['a', 0, 'b']).
Lodash utilizes an internal function called castPath to
transform any string path into a linear array of string keys. For
example, 'user.posts[0].title' is converted into
['user', 'posts', '0', 'title'].
Sequential Step-by-Step Traversal
Once the path is converted into an array, _.get
iteratively accesses each segment using an internal loop, moving one
level deeper with each iteration:
- Base Check: The function maintains an internal pointer referencing the current object, starting with the root object provided in the first argument.
- Nullish Guard: At the start of each step in the
loop,
_.getchecks whether the current pointer isnullorundefined. - Short-Circuiting: If the pointer evaluates to a nullish value at any point before the end of the path is reached, the iteration halts immediately. It does not attempt to access properties on that nullish reference.
- Advancement: If the current value is valid
(non-nullish), Lodash retrieves the next key via bracket access
(
current = current[key]) and advances to the next segment.
const order = {
id: 101,
customer: null
};
// Halts at 'customer' because it is null, avoiding an error on 'email'
const email = _.get(order, 'customer.email');
// Result: undefinedResolving to Default Values
A critical aspect of _.get is its handling of default
values. The fallback value is only returned under specific
conditions:
- If the traversal short-circuits due to a
nullorundefinedparent, the final computed value is consideredundefined. - If the path successfully resolves to an explicit
undefined, the fallback triggers. - If the path resolves to an explicit
null, the default value does not trigger by default, becausenullis considered an intentional value in JavaScript.
const user = {
name: "Alex",
preferences: null
};
// 1. Unreachable property due to null parent -> returns default
_.get(user, 'preferences.theme', 'dark'); // Returns: 'dark'
// 2. Property explicitly exists as null -> returns null, not default
_.get(user, 'preferences', 'default_preferences'); // Returns: null
// 3. Property does not exist -> returns default
_.get(user, 'settings.notifications', true); // Returns: trueBy decomposing the path into atomic segments and enforcing strict
nullish checks before every individual property access,
_.get ensures safe navigation through incomplete, dynamic,
or unpredictable data structures.