DEV Community

Cover image for Optional Chaining in JavaScript
Ryan Lanciaux
Ryan Lanciaux

Posted on • Originally published at ryanlanciaux.com

Optional Chaining in JavaScript

In this article, we're going to take a quick look at the new, Optional Chaining operator in JavaScript. This language feature is valid JavaScript as of ES 2020 (the official definition of the language).

To take a look at why I think this feature is compelling, let's assume we have an object that represents a menu for a conference meal plan. Each object represents a different day for the conference and each day can have breakfast, lunch, and dinner.

const monday = {
  menuItems: {
    breakfast: {
      items: ['Eggs', 'Oatmeal', 'Cereal']
    },
    lunch: {
      items: ['Sandwich']
    },
    dinner: {
      items: ['Cheeseburger', 'Salads', 'Tempeh Sandwich']
    }
  }
};

const tuesday = {
  menuItems: {
    breakfast: {
      items: ['Cereal', 'Bagel']
    },
    dinner: {
      items: ['Tacos']
    }
  }
};
Enter fullscreen mode Exit fullscreen mode

For our example, we'd like to console.log the first element of the lunch object. We'll display "No lunch on this day" for any day where lunch is not specified (and therefore not provided). We'll start with the following code.

function logLunch(day) {
  const lunchItem = day.menuItems.lunch.items[0];

  console.log(lunchItem || "No lunch on this day");
}


logLunch(monday);
logLunch(tuesday);
Enter fullscreen mode Exit fullscreen mode

This function works well for Monday, but fails for the Tuesday object since it only specifies a breakfast and dinner. Typically we could solve that by ensuring our properties exist before interacting with them. In this case, our expression could look something like this:

const lunchItem = day && day.menuItems && day.menuItems.lunch && day.menuItems.lunch.items && day.menuItems.lunch.items[0]
Enter fullscreen mode Exit fullscreen mode

It's not very pleasant to guard each property like this!

Optional Chaining

Thankfully, we can rewrite this line with Optional Chaining to the following:

const lunchItem = day?.menuItems?.lunch?.items[0];
Enter fullscreen mode Exit fullscreen mode

We're using the ?. instead of a . between properties. This ?. is the optional chaining operator. This entire expression will be evaluated as undefined if any of the properties are null or undefined. Instead of checking these properties, we can express the desired intent much more cleanly with this new operator.

Check out the example for this article on Codepen.

I'd love to know of any thoughts you have. You can find me on Twitter here!

Top comments (2)

Collapse
 
bernardbaker profile image
Bernard Baker

Good example of optional chaining.

Collapse
 
ryanlanciaux profile image
Ryan Lanciaux

Thanks a ton! ๐Ÿ˜ƒ