The optional-chaining operator

We can get nested values from objects by chaining their keys. We run into an error when we try to get a value from something that does not exist. With optional chaining, these calls return undefined instead of throwing errors.

// this person’s address is nested in the outer object as another object
const mario = {
  occupation: 'Plumber',
  address: {
    street: 'Rainbow Road',
    zip: '81664'
  }
}

// we can get the full address, or drill into it to get the street
mario.address         // ⇒ { street: 'Rainbow Road': zip: '81664' }
mario.address.street  // ⇒ 'Rainbow Road'

// we don’t have a nested address for this person
const toad = {
  occupation: 'Explorer'
}

// if we try to get the street, JavaScript will throw an error
toad.address         // ⇒ undefined
toad.address.street  // TypeError: undefined is not an object

// the ?. operator returns `undefined` if it hits any undefined value
toad?.address          // ⇒ undefined (same as without the questionmark)
toad?.address?.street  // ⇒ undefined (no error!)