Optional Chaining
Optional chaining (?.) is a safe way to access nested object properties, even if an intermediate property doesn't exist. If the property before ?. is undefined or null, the expression short-circuits and returns undefined instead of throwing an error.
1. The Problem
Before optional chaining, accessing a deeply nested property required checking every level to avoid TypeError: Cannot read properties of undefined.
const user = {};
// Error! user.address is undefined
// console.log(user.address.street);
// The old way (verbose)
const street = user.address && user.address.street;
console.log(street); // undefined
2. The Solution (?.)
With optional chaining, you can simplify this check.
const user = {};
const street = user.address?.street;
console.log(street); // undefined (no error)
If user.address exists, it proceeds to access .street. If user.address is null or undefined, it stops immediately.
3. Syntax Variations
Object Properties
obj?.prop
obj?.[expr]
Arrays
const arr = null;
const item = arr?.[0]; // undefined
Function Calls
Useful if an API might not return a method you expect.
const user = {
admin() {
console.log("I am admin");
}
};
user.admin?.(); // "I am admin"
user.guest?.(); // undefined (no error)
4. Short-Circuiting
If the left-hand side is nullish, the right-hand side is not evaluated.
let x = 0;
const obj = null;
obj?.[x++]; // x is not incremented because obj is null
console.log(x); // 0
5. Combining with Nullish Coalescing
Optional chaining is often used with the Nullish Coalescing Operator (??) to provide a default value if the chain is broken.
const user = {};
const street = user.address?.street ?? "Unknown Street";
console.log(street); // "Unknown Street"
programming/javascript/vanilla/javascript programming/javascript/vanilla/es6-features