Pentru că de cele mai multe ori aplicațiile noastre au logică complexă, avem nevoie să facem foarte multe validări înainte de executarea anumitor funcții. Fiind concentrați pe implemetarea logicii de business, de multe ori uităm să avem grijă și de calitatea codului, astfel că ajungem să adăugăm tot felul de condiții inutile, scăzând în felul ăsta atât calitatea cât și lizibilitatea codului.

Ajunge astfel să scriem cod cam așa:

const order = {
  id: 1,
  customer: {
    firstName: "Ion",
    lastName: "Popescu",
  },
};

if (order.deliveryAddress) {
  const city = order.deliveryAddress.city;
  if (city) {
    //fă ceva aici..
  }

  const street = order.deliveryAddress.street;

  if (street) {
    //fă altceva aici..
  }
}

În cazul de mai sus, dacă nu vom verifica existența lui deliveryAddress, codul nostru ar eșua cu o eroare de genul: TypeError: Cannot read properties of undefined (reading 'city') Adică deliveryAddress este evaluată ca undefined și atunci pe undefined nu există city, pe care noi încercăm să o citim. De aici și nevoia respectivă de validare.

Totuși if-ul pentru verificarea deliveryAddress e inutil în contextul dat, iar mai mult de atât, în momentul în care vom avea foarte multe lucruri de validat, complexitatea acestor if-uri va deveni destul de mare și astfel ar fi destul de greu de citit și înțeles.

Optional chaining nu presupune decât folosirea operatorului ?., care va face validarea câmpului anterior prin verificarea faptului că nu este null sau undefined. Asta înseamnă că dacă proprietatea pe care e aplicat operatorul este null sau undefined, acțiunea imediat următoare nu va mai fi executată.

Refactorizănd codul de mai sus, ar trebui să obținem:

const order = {
  id: 1,
  customer: {
    firstName: "Ion",
    lastName: "Popescu",
  },
};

const city = order.deliveryAddress?.city;

if (city) {
  //fă ceva aici..
}
const street = order.deliveryAddress?.street;

if (street) {
  //fă altceva aici..
}

Tocmai am scăpat de o condiție inutilă adăugând un singur extra caracter în toată expresia.
Acum poate te întrebi: Ok, dar pentru order de ce nu facem asta?
În cazul lui order e clar că nu e nici null, nici undefined pentru că e declarat imediat mai sus. Dar în cazul valorilor rezultate din executarea unor funcții, e bine tot timpul să facem aceste verificări pentru a nu risca eșuarea aplicației la runtime.

Nu trebuie să-ți faci griji, în general codul se scrie în mod iterativ și prima versiune este în general foarte neoptimizată.

Cam atât, până data viitoare nu uita să încerci constant să-ți optimizezi codul.