ES2020 - co nowego nas czeka?

Czas czytania: 3 min
Liczba słów: 573
Data: 17-12-2019
Udostępnij:

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łędem
  • Promise.race - zwraca wynik pierwszego udanego Promise'a lub błędu
  • Promise.allSettled - nowość w następnej wersji JS'a - patrz niżej
  • Promise.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?