Sitemap
Abdul Mufeed

Abdul Mufeed

Mastering Optional Chaining in JavaScript: The Cleaner Way to Access Nested Properties

3 min readSep 30, 2025

--

Press enter or click to view image in full size

In JavaScript, working with deeply nested objects is a common scenario, especially when dealing with API responses or complex data structures. But accessing nested properties can quickly become cumbersome and error-prone if any intermediate property is null or undefined. Traditionally, this required verbose checks that clutter the code:

if (user && user.address && user.address.city) {
console.log(user.address.city);
} else {
console.log("City not available");
}

This repetitive pattern not only hurts readability but also introduces a risk of typos or missed checks.

Enter Optional Chaining (?.) — a game-changing operator introduced in ECMAScript 2020 that allows safe access to deeply nested properties without manually checking each level.

What is Optional Chaining?

Optional chaining lets you write expressions that access nested properties in a concise way. If any part of the chain is null or undefined, it short-circuits and returns undefined instead of throwing an error.

The syntax uses ?. instead of the normal dot (.) notation:

const city = user?.address?.city;

If user or user.address is missing, city will simply be undefined, rather than throwing TypeError.

Why Use Optional Chaining?

  • Cleaner code: Eliminates repetitive null checks.
  • Safety: Prevents runtime errors from accessing properties of null or undefined.
  • Improved readability: Makes your intent clearer and reduces noise.
  • Works with arrays and functions: Can safely access array elements or call functions conditionally.

How Does it Work?

Optional chaining works by checking if the value before ?. is null or undefined. If it is, the entire expression evaluates to undefined and stops evaluating further.

Get Abdul Mufeed’s stories in your inbox

Join Medium for free to get updates from this writer.

For example:

const nestedValue = obj?.prop1?.prop2;
  • If obj is null or undefined, nestedValue is undefined.
  • If obj.prop1 is null or undefined, nestedValue is undefined.
  • Otherwise, it returns obj.prop1.prop2.

Optional Chaining with Arrays

You can safely access array elements even if the array itself may not be defined:

const firstItem = data?.items?.[0];

If data or data.items is missing, firstItem is undefined instead of throwing an error.

Optional Chaining with Function Calls

You can conditionally call functions without checking if they exist:

user?.getProfile?.();

If user or getProfile is missing, this will safely return undefined rather than throwing.

Combining with Nullish Coalescing

Optional chaining is often useful when combined with the nullish coalescing operator (??) to provide default values:

const city = user?.address?.city ?? "Unknown City";
console.log(city); // Prints city or "Unknown City"

This sets a sensible default if the nested value is missing or undefined.

Real-World Example

Consider an API response for a social media app:

const post = {
author: {
name: "Jane Doe",
social: {
twitter: "@janedoe"
}
}
};

To safely get the Twitter handle of the post’s author without errors if the data is incomplete, you use:

const twitterHandle = post?.author?.social?.twitter ?? "No Twitter";
console.log(twitterHandle); // "@janedoe"

If the social object was missing, it would output "No Twitter" gracefully.

Important Notes

  • Optional chaining only works when accessing properties, elements, or function calls, not for assignments.
  • Use it judiciously — overuse may mask programming errors where data is unexpectedly missing.
  • It supports dynamic property access as well: obj?.[dynamicKey].

Conclusion

Optional chaining drastically reduces boilerplate and error-prone checks in your code, making it cleaner and safer when working with complex nested data. It’s a must-know feature for modern JavaScript developers, improving both readability and robustness.

Experiment using this operator today and see how it simplifies your code and protects against runtime errors!

--

--