Wielkimi krokami zbliża się do nas Nowy Rok a wraz z nim nowe funkcjonalności w JavaScript. Czy wiemy czego możemy się spodziewać? I czy warto na to czekać? Co się zmieni w tym popularnym języku i jak to wpłynie na sposób w jakim piszemy kod?
Optional chaining i Nullish coalescing
O optional chaining
i nullish coalescing
pisałem już gdy ta funkcjonalność pojawiła się w Typescript. W nowej wersji JS’a będzie wyglądało to identycznie więc zapraszam do tamtego postu jeśli chcecie poznać szczegóły - znajdziecie go tutaj
BigInt
Następna nowość nie jest tak spektakularna ale może być przydatna w niektórych zastosowaniach(na razie nie miałem sytuacji gdzie by to się przydało ale kto wie co przyniesie przyszłość). BigInt pozwala na przechowywanie liczb całkowitych, które są większe od 2^53. Możemy zadeklarować zmienną tego typu na dwa sposoby:
const a = BigInt(10)
const b = 10n
typeof(a) // "bigint"
typeof(b) // "bigint"
Pomimo tego, że jest to ciągle liczba całkowita to ma zupełnie inny typ niż to co wykorzystywaliśmy do tej pory. Warto o tym pamiętać gdy będziemy mieszać obie koncepcje i będziemy próbować porównać dwie zmienne:
const a = 10
const b = 10n
a == b // true
a === b // false
Ciągle mamy do czynienia z liczbami całkowitymi więc operacje matymatyczne będą działały poprawnie - jedyne ograniczenie to nie możemy mieszać operacji pomiędzy Number a BigInt
const a = BigInt(10)
const b = 9
const c = a + 1n // 11
const d = a + b // Cannot mix BigInt and other types, use explicit conversions
Ale za to możemy porównywać je między sobą - dzięki temu możemy spokojnie umieszczać je razem w tablicy i np.: sortować
const a = BigInt(10)
const b = 9
a < b // false
a > b // true
Promise.allSettled
Jedna z nowości na którą czekam z niecierpliwością. Promise.allSettled
jest jedną z 4 funkcji, które pozwalają nam pracować z Promise’ami. Do tych funkcji zaliczamy:
Promise.all
- zwraca wynik gdy wszystkie Promise’y zakończą się sukcesem lub przynajmniej jeden zakończy się błędemPromise.race
- zwraca wynik pierwszego udanego Promise’a lub błęduPromise.allSettled
- nowość w następnej wersji JS’a - patrz niżejPromise.any
- póki co jest to na etapie propozycji - będzie zwracało wartość pierwszego poprawnie rozwiązanego Promise’a ale nie będzie się zatrzymywało na błędzie
Promise.allSettled
będzie działał podobnie do Promise.all
ale nie będzie przerywany po wystąpieniu błędu. Zamiast tego po zakończeniu wszystkich Promise'ów
(niezależnie czy zakończy się statusem fullfiled
czy rejected
) dostaniemy tablicę obiektów. Każdy obiekt reprezentuje pojedynczy Promise
i zwiera informacje jak się zakończył oraz z jaką wartością
Promise.allSettled([Promise.resolve(1), Promise.reject(2), Promise.resolve(3)]).then(console.log)
/*
0: {status: "fulfilled", value: 1}
1: {status: "rejected", reason: 2}
2: {status: "fulfilled", value: 3}
*/
import()
Kolejna dodana rzecz to jest dynamiczny import() - nie należy go mylić z importem, który spotykamy w modułach JS. import()
pozwala na dynamiczne ładowanie kodu JS w trakcie trwania programu np.: na skutek jakieś akcji na stronie np.: naciśnięcia przycisku. Dodatkowo samo polecenie jest asynchroniczne więc będziemy je obsługiwać przy pomocy then().catch()
import('path_to_script.js')
.then(module => {
//obsługa skryptu
})
.catch(err => {
//obsługa błędu
});
globalThis
Na sam koniec coś co może nie wygląda jako super funkcjonalność ale może ułatwić życie osobom piszącym biblioteki, które mogą być używane w różnych środowiskach i korzystają z globalnego this
. This
w zależności od środowiska, w jakim program będzie uruchomiony, będzie wskazywał na inny element np.:
- W przeglądarce this == window
- W node.js this == global
Jeżeli nasza biblioteka korzysta z tego globalnego this
to aktualnie musimy wykonywać kawałek brzydkiego if’a by mieć pewność do czego się odwołujemy. Teraz będzie to łatwiejsze i zunifikowane we wszystkich miejscach
Na co jeszcze poczekamy?
A co nasz czeka w dalszej przyszłości? W Stage 3 są już propozycje dodania prywatnych zmiennych oraz metod, statycznych pól i metod w klasach oraz top-level await
. Jest tam też już propozycja dla Promise.any
o którym pisałem wyżej. Nieco dłużej możemy poczekać na dekoratory, które dopiero są na Stage 2.
A co wam się podoba najbardziej z nadchodzących nowości? Jak dla mnie jest to na pewno optional chaining
, nullish coalescing
oraz Promise.allSettled
. Są to przykłady zmian, które pomogą pisać bardziej zwięzły kod - a im mniej kodu tym mniej okazji by się pomylić. Chciałbym też by wspomniane przez ze mnie fukcjonalności, które nie wejdą w tym roku weszły jak najszybciej ale tutaj trzeba uzbroić się w cierpliwość. Dodalibyście coś jeszcze do tej listy?