Javascript - Nullish coalescing & Optional chaining

Specyfikacja ECMAScript cały czas się rozwija, powstają nowe ciekawe featury. Jakiś czas temu, zostały zaproponowane, przez Gabriela Isenberga, dwa nowe: nullish coalescing i optional chaining. Dziś przyjrzymy im się trochę bliżej.

Zaczynamy!

Nullish coalescing

Jest to logiczny operator, który zwraca wartość po prawej stronie od kropki(operand), jeśli ta po lewej jest null lub undefined.

Operator OR(||)

Przypomnienie, operator OR zwraca wartość która jest prawdziwa. Spójrzmy na przykładzie:

undefined || "Hello world!"; // 'Hello world!'
[1, 2, 3] || null; // [1,2,3]
"" || 27; //27

Nullish coalescing i operator ??

Operator ??, różni się tym od operatora ||, że nie bierze pod uwagę wszystkich wartości falsy, a jedynie null i undefined.

let userName = ""; // falsy value

const newUser = userName || "Karol"; //Karol
const anotherUser = userName ?? "Maciek"; // '', ponieważ wartość nie jest null/undefined

Okej, ale jak działa ten cały Nullish coalescing operator? Poniższe wyrażenia działają w ten sam sposób.

someValue ?? anotherValue;
someValue !== undefined && someValue !== null ? someValue : anotherValue;

Spróbujmy połączyć znany nam już operator OR z operatorem ??.

null || undefined ?? "Karol"; // coś poszło nie tak - SyntaxError
(null || undefined) ?? "Karol" // Karol

Operator ?? w praktyce

Stwórzmy funkcję, która będzie przyjmowała objekt użytkownika jako parametr, jeśli jego właściwość userName będzie null lub undefined zwrócimy imię Karol.

const getUserName = (user) => user.userName ?? "Karol";

Możemy użyć również destrukturyzacji w połączeniu z defaultową wartością(😮):

const getUserName = ({ userName = "Karol" }) => userName;

Optional chaining

Jak to działa? Jeśli wartość przed znakiem zapytania jest null lub undefined to zwracamy undefined. Jeśli chodzi o funkcje, jeśli dana funkcja nie istnieje, zwracany jest undefined. To tyle, jeśli chodzi o teorię, przejdźmy do praktyki.

const user = {
  name: "Maciej",
  email: "maciej@gmail.com",
  id: 123,
};

const userName = user.favouriteFood?.milk; // undefined
console.log(getUserId?.()); // undefined
let milk = user.favouriteFood && user.favouriteFood.milk; // stary sposób
milk = user.favouriteFood?.milk; // nowy sposób

Metody, tablice i objekty

Jak wygląda sprawa z metodami obiektów? Bardzo podobnie jak w poprzednich przykładach:

const getUserFavouriteFood = user.getFavouriteFood?.();

A co z tablicami i indexami?

const arrayItem = someArray?.[7];

Short-circuiting, jeśli wartość po lewej stronie jest null/undefined, to operacja nie zostanie wykonana:

const newUser = null;
const userAge = 20;
const incrementedAge = newUser?.[userAge++];

userAge; // 20

Zagnieżdżony optional chaining

Nasz objekt user:

const user = {
  name: "Wojtek",
  email: "wojciechkowalski@gmail.com",
  details: {
    age: 28,
    address: {
      street: "Mickiewicza",
    },
  },
};

Jeśli chcielibyśmy wyciągnąć kod pocztowy, przy pomocy optional chaining moglibyśmy to zrobić w taki sposób:

const zipCode = user.details?.address?.zipCode;

Nullish coalescing w połączeniu z optional chaining

Nullish coalescing może być wykorzystany do podania defaultowej wartości, po optional chaining. Użyjmy poprzedniego przykładu z kodem pocztowym.

const user = {
  name: "Wojtek",
  email: "wojciechkowalski@gmail.com",
  details: {
    age: 28,
    address: {
      street: "Mickiewicza",
    },
  },
};

const zipCode = user.details?.address?.zipCode ?? "87-100"; // 87-100

Podsumowanie

Mam nadzieję, że przybliżyłem Ci założenia stojące za Nullish coalescing i Optional chaining, jeśli chcesz się dowiedzieć więcej, możesz zajrzeć do źródeł, szczególnie polecam Dr. Axela Rauschmayera i oczywiście dokumentację MDN.

Do usłyszenia!

Źródła

GitHubGitHubGitHub