Od przełomowego roku 2015 w którym to została wydana specyfikacja ES6 (znana też jako ES2015), otrzymujemy nową specyfikację języka ECMA Script co około 12 miesięcy. To właśnie na tej specyfikacji opiera się współczesny JavaScript.
Co prawda na oficjalne informacje trzeba będzie poczekać do Czerwca, jednak już teraz możemy domyślać się, co się w nich znajdzie.
Proposal
Proposal to wniosek (użycie polskiej nazwy jest rzadkością i zdecydowanie zalecam stosowanie angielskiej), składany przez społeczność, lub pojedynczą osobę, który zawiera pomysł na nową funkcjonalność języka. Zanim jednak zostanie ona dodana, musi przejść przez kilka etapów i zostać zaakceptowana przez organizację ECMA. Pełna lista proposali znajdziesz w oficjalnym repozytorium ECMA.
W dalszej części artykułu będę powoływać się na etapy implementacji, w których znajdują się poszczególne funkcjonalności, dlatego zrozumienie ich znaczenia ułatwi Ci lekturę.
Etap 0 - bardzo wczesna faza. W tym momencie funkcjonalność nie jest jeszcze rozważana przez organizację ECMA. Została jedynie zaproponowana i wymaga jeszcze wielu udoskonaleń i dogłębnego researchu.
Etap 1 - na tym etapie funkcjonalność zostaje wzięta pod uwagę przez ECMA. Wyłoniony zostaje jej opiekun (lub kilku opiekunów), czyli osoba odpowiedzialna za rozwój danej funkcjonalności. Przedyskutować należy między innymi semantykę, a także powód, dla którego funkcjonalność została zgłoszona i sposób jej implementacji.
Etap 2 - w tym momencie organizacja ECMA zdecydowała się już wybrać konkretne rozwiązanie, jednak nie jest to jeszcze finalna wersja i wciąż może ulec znacznym zmianom. Dopiero na tym etapie można się spodziewać, że funkcjonalność zostanie dodana do specyfikacji. Należy jednak pamiętać, że nawet na tym etapie na jaw mogą wyjść nieznane dotąd fakty, które uniemożliwią dalsze prace i tym samym wdrożenie (np. nieprzewidziany problem z kompatybilnością wsteczną)
Etap 2.7 - proposal został zaakceptowany i przechodzi przez proces walidacji. Rozwiązanie również jest gotowe i nie będzie podlegać żadnym gwałtownym zmianom. Dojście do tego etapu oznacza również, że istnieje pełna dokumentacja.
Etap 3 - ECMA rekomenduje daną funkcjonalność do wdrożenia. Nie oznacza to, że pojawi się ona w kolejnej specyfikacji, ponieważ nadal mogą być wprowadzone niezbędne zmiany w przypadku wystąpienia problemów.
Etap 4 - ostatni z etapów. Funkcjonalności, które zaszły aż tutaj będą wdrożone do standardu ECMA Script w kolejnej specyfikacji.
Pełną dokumentację procesu możesz znaleźć tutaj.
Co pojawi się w ES2024?
Proposale znajdujące się na etapie czwartym są niemal pewne, dlatego to właśnie od nich zaczniemy. Skupimy się jednak tylko na tych najważniejszych (gdybym chciał opisać wszystkie, to byłby to bardzo długi artykuł).
Promise.withResolvers
To nowa, statyczna metoda obiektu Promise
. Z jej pomocą możemy uzyskać dostęp do funkcji resolve
oraz reject
poza konstruktorem obiektu Promise.
Co prawda do tej pory również było to możliwe, jednak wymagało nieco więcej kodu i własnego sposobu implementacji. W efekcie wiele bibliotek i projektów wynajdywało koło od nowa, a kod różnił się w każdym z projektów.
Repozytorium: https://github.com/tc39/proposal-promise-with-resolvers
Dokumentacja: https://tc39.es/proposal-promise-with-resolvers/
groupBy
Metoda groupBy
jest niezwykle popularna i występuję w niemal każdym języku programowania z wyjątkiem JavaScript. Po wprowadzeniu tej funkcjonalności będziemy mieć dostęp do Object.groupBy
oraz Map.groupBy
.
Obie metody przyjmują obiekt iterowalny (np. tablicę), a następnie zwracają odpowiednio obiekt i mapę, w których wartości są zgrupowane pod odpowiednimi kluczami.
Repozytorium: https://github.com/tc39/proposal-array-grouping
Dokumentacja: https://tc39.es/proposal-array-grouping/
Flaga -v i set notation
Dodana zostanie nowa flaga -v
dla wyrażeń regularnych, a jej użycie, pozwoli na wykorzystanie równolegle wprowadzonej składni, nazwanej jako set notation.
Jednak flaga v
nie została wprowadzona jedynie w celu zachowania kompatybilności wstecznej. Poprawia także kilka aspektów związanych z działaniem wyrażeń regularnych.
Repozytorium: https://github.com/tc39/proposal-regexp-v-flag
Dokumentacja:
Top-level await
Nazwa mówi tu sama za siebie - po wdrożeniu tej funkcjonalności będziemy mogli korzystać ze słowa await
poza funkcjami oznaczonymi jako async
.
Repozytorium: https://github.com/tc39/proposal-top-level-await
Na co jeszcze możemy liczyć?
Funkcjonalności wypisane poniżej znajdują się na etapie trzecim lub drugim, dlatego ich wdrożenie w najnowszej specyfikacji jest nieco mniej prawdopodobne. Podobnie jak wcześniej, omówimy tylko te najważniejsze.
Temporal
Autorzy tego proposala zwrócili uwagę na to, że obiekt Date
od dawna jest niewystarczający, a programiści są zmuszeni do używania zewnętrznych bibliotek, takich jak moment.js lub date-fns. Potwierdzają to także wyniki ankiety State of JS 2022 - na trzecim miejscu widnieje lepszy sposób pracy z datami.
Nowy obiekt Temporal
będzie zawierać wiele metod, które znacznie ułatwią pracę z datami w JavaScript. Jeżeli już teraz chcesz zapoznać się z jego możliwościami, to koniecznie zajrzyj do dokumentacji (link znajdziesz poniżej).
Repozytorium: https://github.com/tc39/proposal-temporal
Dokumentacja: https://tc39.es/proposal-temporal/docs/index.html
Pipeline operator
W ankiecie State of JS 2020 wielu programistów wskazało, że to właśnie pipeline operator jest funkcjonalnością, którą chcieliby zobaczyć w JavaScript.
Zaproponowana składnia wygląda następująco: |>
i rozwiązuje problem głębokiego zagnieżdżania kolejnych wywołań funkcji, które jako argument przyjmują wynik działania innej funkcji.
Repozytorium: https://github.com/tc39/proposal-pipeline-operator
Dokumentacja: https://tc39.es/proposal-pipeline-operator/
Decorators
Dla użytkowników TypeScriptu dekoratory z pewnością nie są tematem zupełnie obcym. Znajdziemy je również w wielu innych językach programowania (np. Python).
Dektoratory to funkcje, które są wywoływane np. na klasach i ich elementach (metody, właściwości) w momencie ich definiowania. Używamy do tego @
. Autorzy postanowili nie dodawać specjalnej składni do tworzenie dekratorów. Oznacza to, że każda funkcja może zostać użyta jako dekorator.
Ich głównym celem jest dodanie funkcjonalności do wybranej wartości i zmodyfikowanie jej zachowania w czasie działania aplikacji.
Więcej na temat wzorca dekoratora możesz znaleźć tutaj.
Repozytorium: https://github.com/tc39/proposal-decorators
Podsumowanie
Pamiętaj, że omówiłem tu jedynie najważniejsze (moim zdaniem) zmiany. Jeżeli chcesz zapoznać się z pełną listą, to możesz ją znaleźć pod tym linkiem, a jeżeli już teraz chciałbyś lub chciałabyś sprawdzić nowe możliwości w praktyce, to możesz to zrobić wykorzystując Babel.js.
Alternatywą może być konsola w przeglądarce, ponieważ wiele z nich (w tym Google Chrome) implementuje nowe rozwiązania, zanim pojawią się w oficjalnej specyfikacji ECMA Script, a nierzadko, zanim w ogóle dojdą do etapu czwartego.