Co to jest JavaScript?
Wprowadzenie
Z punktu widzenia technologicznego, JavaScript jest językiem programowania, który:
-
ma składnię zbliżoną do C,
-
zawiera dziedziczenie oparte na prototypach (ang. prototype-based inheritance), inaczej zwane orientacją prototypową,
-
zawiera dziedziczenie oparte na klasach (ang. class-based inheritance), inaczej zwane orientacją klasową, oraz
-
wspiera wiele paradygmatów programowania (ang. multi-paradigm programming), włączając w to programowanie obiektowe (ang. object-oriented), funkcyjne (ang. functional), imperatywne (ang. imperative), oraz sterowane zdarzeniami (ang. event-driven).
Początki JavaScript
W 1993 roku, przeglądarka NCSA Mosaic, utworzona w National Center for Supercomputing Applications przy Uniwersytecie Illinois, została wydana. Stała się pierwszą powszechnie używaną przeglądarką dostępną na systemie operacyjnym Windows, która integrowała tekst i grafikę. Wspierała wiele protokołów internetowych takich jak HTTP, czyli Protokół Przesyłania Dokumentów Hipertekstowych (ang. Hypertext Transfer Protocol) oraz FTP, czyli Protokół Przeysłania Plików (ang. File Transfer Protocol), ale nie zawierała języka skryptowego podobnego do JavaScript. Microsoft wylicencjował jedną z wersji Mosaic w 1995 roku i zbudował Internet Explorer na jej podstawie.
W 1994 roku, główny deweloper Mosaic utworzył przeglądarkę Netscape Navigator, która szybko stała się popularna. W roku 1995, zdecydowano się dodać język skryptowy do Netscape Navigator, aby umożliwić dynamiczną modyfikację dokumentów. Jednym z pomysłów było użycie języka Java we współpracy z Sun Microsystems, innym wbudowanie języka Schema. Jednakże, finalnie, zdecydowano się na utworzenie nowego. Zadanie to zostało powierzone Brendanowi Eich.
Nowo-powstały język skryptowy nazwany został LiveScript w jednej z beta iteracji przeglądarki Netscape, ale nazwa została zmieniona na JavaScript w oficjalnym wydaniu. Pierwsza oficjalna wersja Netscape Navigator, która zawierała JavaScript została wydana w 1995 roku.
Microsoft również wydał swoją przeglądarkę, Internet Explorer, w roku 1995. Internet Explorer zawierał JScript, którego program interpretujący (ang. interpreter) był poddany inżynierii odwrotnej (ang. reverse-engineered) z Netscape Navigator. Tym samym marsz do powszechności JavaScript jako głównego języka skryptowego sieci rozpoczął się.
Standaryzacja JavaScript przez Ecma
Około jeden rok po oficjalnym debiucie, Netscape przedłożył JavaScript do Ecma Inernational do standaryzacji.
Pierwsza wersja JavaScript standaryzowana przez Ecma International nazwana została ECMAScript (ES1) i została wydana w roku 1997.
Druga standaryzowana wersja JavaScript, nazwana ECMAScript 2 (ES2), została wydana w roku 1998.
Trzecia standaryzowana wersja JavaScript, nazwana ECMAScript 3 (ES3) została wydana w roku 1999.
Początkowo, Microsoft oraz jego przeglądarka Internet Explorer stosowali się do standaryzacji Ecma, ale później jego współpraca ustała. Z uwagi na przeważający ówczesny udział w rynku przeglądarek Internet Explorer, spowodowało to, że czwarta wersja standaryzowanego JavaScript (ES4) nigdy nie została wydana.
Dominacja Microsoft na rynku przeglądarek wczesnych lat dwutysięczncyh została złamana wydaniem w roku 2004 następcy Netscape Navigator'a, Firefox, oraz wydaniem w roku 2008 Google Chrome. Google Chrome zawierał szybki silnik uruchomieniowy (ang. runtime engine) - V8. Obie przeglądrki przejęły duże części rynku. Potrzeba standaryzacji pojawiła się na nowo.
Wspólny wysiłek zainteresowanych stron oraz Ecma International doprowadził do wydania epokowych wersji JavaScript, a mianowicie ECMAScript 5 (ES5) w roku 2009 oraz ECMAScript 6 (ES6) w roku 2015.
Kolejne wersje JavaScript oznaczane są raczej rokiem wydania, niż numerem. Dlatego, po ES6, wersje ECMAScript nazwane zostały ECMAScript 2016, ECMAScript 2017, ECMAScript 2018, ECMAScript 2019, etc. Jednakże, numeryczne wersje, ES7, ES8, ES9, ES10, również czasem są używane.
JavaScript jako kliencki język programowania
Jak nakreślono powyżej, JavaScript powstał jako język programowania wbudowany w program kliencki (ang. user-agent), w przeglądarkę.
Dziś, JavaScript jest głównym i najbardziej rozpowszechnionym klienckim językiem programowania Sieci Światowej (ang. World Wide Web).
Po stronie klienta JavaScript może być używany między innymi do:
-
manipulowania Obiektowym Modelem Dokumentu (ang. Document Object Model), to jest do dodawania, zmiany, oraz usuwania elementów dokumentów w przeglądarkach, oraz
-
pobierania danych ze zdalnych hostów (komputerów).
Aby ułatwić tworzenie oprogramowania w JavaScript po stronie klienta powstało wiele bibliotek i frameworków. Obecnie, jedne z najpopularniejszych z nich to:
JavaScript jako serwerowy język programowania
Pomimo tego, że JavaScript rozpoczął swoje życie jako kliencki (wbudowany w przeglądarkę) język skryptowy, to obecnie jest również powszechnie używany jako język serwerowy
Popularność JavaScript jako języka serwerowego rozpoczęła się wraz z utworzeniem Node.js w roku 2009 przez Ryan Dahl'a.
Node.js używa pod spodem silnika JavaScript V8 stworzonego przez Google. Node.js zawiera pętle wydarzeń (ang. event loop) oraz interfejsy I/O (wejścia i wyjścia).
Domyślny menadżer paczek dla Node.js zwany jest npm.
Jest wiele serwerowych bibliotek i frameworków JavaScript, które ułatwiają tworzenie programowania. Niektóre godne uwagi, to:
JavaScript jako wysokopoziomowy język programowania
JavaScript jest wysokopoziomowym językiem programowania (ang. high-level programming language).
JavaScript jako kompilowany na bieżąco język programowania
JavaScript jest językiem programowania kompilowanym na bieżąco (ang. just-in-time compiled).
JavaScript jako słabo-typowany język programowania
JavaScript jest często opisywany jako słabo-typowany (ang. weakly typed) język programowania.
Jednakże, istnieje wiele różnych definicji czym słabo-typowany język programowania rzeczywiście jest.
Gdy opisywany jest JavaScript jako słabo-typowany język, to przez to często rozumiane są zdolności JavaScript do domyślnej zmiany typów (ang. implicit casting) swych wartości w niektórych ze swoich wbudowanych operatorów.
Na przykład, gdy porównujemy dwie wartości o różnych typach danych używając ==
, czyli operatora porównywania abstrakcyjnego (ang. abstract comparison operator), to typy tych wartości są domyślnie zmieniane na spójne przed samym porównaniem.
1 == "1" // => true
Innym przykładem jest domyślna zmiana typu obu operandów na słowo (ang. string), gdy którykolwiek z tych operandów jest liczbą, przez operator binarny +
.
1 + "1" // => "11"
Jeszcze innym przykładem jest domyślna zmiana typów obu operandów na liczbę (ang. number), gdy którykolwiek z tych operandów nie jest liczbą, przez operator binarny -
.
1 - "1" // => 0
JavaScript jako dynamicznie typowany język programowania
JavaScript jest dynamicznie typowanym (ang. dynamically typed) językiem programowania.
// JavaScript (dynamiczne typowanie)
let foo = 42
foo = "czterdzieści dwa" // Zmiana z liczby na słowo dozwolona.
// TypeScript (statyczne typowanie)
let foo = 42 // typ foo statycznie w sposób dorozumiany ustalony jak 'liczba'.
foo = "czterdzieści dwa" // Typ 'słowo' nie może zostać przypisany do typu 'liczba'.
JavaScript jako język programowania oparty na prototypach
Od swojego początku w roku 1995, JavaScript jest językiem programowania opartym na prototypach.
JavaScript implementuje prototypowanie oparte na delegacji.
const czlowiek = { zawod: 'pracowanie', rzad: 'ssaki naczelne' }
const student = { imie: 'Dawid', zawod: 'studiowanie' }
Object.setPrototypeOf(student, czlowiek)
student.imie // => 'Dawid'
student.zawod // => 'studiowanie'
student.rzad // => 'ssaki naczelne'
Czytaj dalej w Dziedziczenie oparte na prototypach w JavaScript.
JavaScript jako język programowania oparty na klasach
Począwszy od ECMAScript 2015 (ES6), JavaScript jest językiem programowania opartym na klasach.
class Pies {
constructor(imie) {
this.imie = imie
}
szczekaj() {
console.log('Hau!')
}
}
const pluto = new Pies('Pluto')
pluto.imie // => 'Pluto'
pluto.szczekaj() // 'Woof!'
Czytaj dalej w Dziedziczenie oparte na klasach w JavaScript.
JavaScript jako obiektowy język programowania
JavaScript jest obiektowym językiem programowania.
const pirat = {
imie: 'Hook',
okrzyk: function() { console.log('Huzzah!') }
}
pirat.imie // => 'Hook'
pirat.okrzyk() // 'Huzzah!'
Jednakże, JavaScript nie jest obiektowym językiem programowania w pełni (tak jak jest np. Ruby), gdyż wciąż zawiera wartości pierwotne (ang. primitive values), takie jak liczby (ang. numbers), słowa (ang. strings), oraz wartości logiczne (ang. booleans), które nie mają stanu, ani metod z nimi powiązanych.
JavaScript jako funkcyjny język programowania
JavaScript jest funkcyjnym językiem programowania.
Gdy funkcje mają zdolności do bycia przypisywanym do identyfikatorów, do bycia przekazywanym jako argumenty, oraz bycia wartościami zwrotnymi innych funkcji, to często określa się je obywatelami pierwszej klasy (ang. first-class citizens).
JavaScript może wykorzystywać dwa wzorce programowania funkcyjnego:
-
nieczyste programowanie funkcyjne, oraz
-
czyste programowanie funkcyjne.
Nieczyste programowanie funkcyjne to programowanie funkcyjne:
-
które może polegać na wartościach spoza zakresu (ang. scope) funkcji i tym samym zwracać różne wartości, gdy podane są te same argumenty, oraz,
-
w których wykonanie funkcji może mieć efekty uboczne (ang. side effects) takie jak modyfikacje wartości spoza zakresu tej funkcji.
Czyste programowanie funkcyjne (ang. pure functional programming) to programowanie funkcyjne:
-
które nie może polegać na wartościach spoza zakresu (ang. out-of-scope) funkcji i tym samym zawsze zwraca te same wartości przy podaniu tych samych argumentów,
-
w których wykonanie funkcji nie może mieć efektów ubocznych takich jak modyfikacja wartości spoza zakresu tej funkcji.
JavaScript jako imperatywny język programowania
JavaScript może być używany jako imperatywny język programowania.
let wiek = 42
const czujeSieMlodo = true
if (czujeSieMlodo) {
wiek = wiek / 2
}
JavaScript jako sterowany wydarzeniami język programowania
JavaScript może być używany jako sterowany wydarzeniami (ang. event driven) język programowania.
// Loguje "kliknięto okno!" za każdym razem, gdy okno przeglądarki jest kliknięte.
const zalogujKlinieteOkno = () => console.log('kliknięto okno!')
window.addEventListener('click', zalogujKlinieteOkno, false)