Skip to main content

Optional Chaining Operator in JavaScript

2 min read

Older Article

This article was published 7 years ago. Some information may be outdated or no longer applicable.

Let’s look at a proposal that brings optional chaining to JavaScript.

What Is Optional Chaining?

Optional chaining already exists in other languages like C# (where they call it the null-conditional operator). It’s a safety mechanism that lets you check whether an object exists before accessing its properties.

Here’s how C# handles it:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    public Person Spouse { get; set; }
}

var spouseName = p?.Spouse?.FirstName; // null-conditional operator
var spouseName = (p == null) ? null : (p.Spouse == null) ? null : p.Spouse.FirstName; // without the null-conditional operator

Optional Chaining in JavaScript

The TC39 committee recently moved the proposal for optional chaining to Stage 3:

WE JUST MOVED OPTIONAL CHAINING IN JS TO STAGE 3 🎉🎉🎉🎉🎉🎉🎉 — Daniel Rosenwasser (@drosenwasser) July 25, 2019

So what does this mean for JavaScript developers?

Right now, to check a property nested inside another object, you need to verify the parent exists first:

/*
Given the following structure:
{
  "user": {
    "name": "John",
    "photo": "john.png",
    "location": {
      "city": "London",
      "country": "UK"
    }
  }
}
  */
const city = user.location && user.location.city;

Skip that check and you’ll hit Uncaught TypeErrors when you try to operate on a property that doesn’t exist:

const city = user.location.city.toUpperCase(); // throws Uncaught TypeError if location.city doesn't exist

With the Optional Chaining Operator (denoted by ?), you can handle this cleanly:

const city = user.location?.city;

The Optional Chaining Operator lets you safely check for the existence of deeply nested properties in objects.

One thing to watch: the correct syntax is ?. (the question mark and dot together). Getting this wrong will trip you up:

const firstElement = someObject?.someArray?.[0] // will work
const secondElement = someObject?.someArray?[1] // nope - incorrect syntax, not using ?.

Under the hood, the operator checks whether the value on the left-hand side is null or undefined. If it is, it returns undefined. Otherwise, it keeps evaluating the expression and returns the correct value.

Note that in Angular we can use a similar feature.

Conclusion

The Optional Chaining Operator will be a genuine help for JavaScript developers because it removes unnecessary null checks on objects. Here’s hoping it gets added to the language soon.