Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90...

229
Języki interpretowane dr inż. Andrzej Grosser Rok akademicki 2015/16 dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 1 / 228

Transcript of Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90...

Page 1: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Języki interpretowane

dr inż. Andrzej Grosser

Rok akademicki 2015/16

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 1 / 228

Page 2: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Plan wykładów I

1 Wprowadzenie do języków skryptowych

2 JavaScript - składnia, bibliotek standardowa

3 JavaScript - zastosowania po stronie przeglądarki

4 Biblioteka JQuery

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 2 / 228

Page 3: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Języki skryptowe

Język skryptowy jest językiem programowania, który umożliwiauruchamianie w specjalnym środowisku programów (skryptów).

Z reguły te programy są interpretowane a nie kompilowane.

Przeznaczeniem tych języków jest automatyzacja powtarzalnychzadań, są również stosowane jako języki osadzone w większychaplikacjach.

Ze względu na swoje właściwości są czasem nazywane językamibardzo wysokiego poziomu lub nawet językami specyfikacji.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 3 / 228

Page 4: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

PHP

Język powstał w połowie lat 90 dwudziestego wieku.

Twórcą pierwszej wersji języka jest Rasmus Lerdorf.

Jest językiem wieloplatformowym - implementacje można znaleźć dlaróżnych systemów (między innymi Windows, Linux, BSD).

Wspiera programowanie obiektowe i strukturalne.

Jest językiem dynamicznym z słabą kontrolą typów.

Jego głównym zastosowaniem jest generowanie stron internetowychna przykład na podstawie danych wprowadzonych w formularz przezużytkownika.

Jego implementacje są najczęściej interpreterami (uruchamianymi postronie serwera).

Najnowsza wersja języka to 7.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 4 / 228

Page 5: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Python

Powstał we wczesnych latach 90 dwudziestego wieku jako następcajęzyka ABC.

Twórcą języka jest Guido van Rossum.

Jest językiem wspierającym kilka paradygmatów programowania -między innymi obiektowy, funkcyjny, strukturalny.

Jest dynamicznym, interpretowanym językiem programowania.

Filozofia programowania kładzie nacisk na prostotę i czytelnośćprogramów (The Zen of Python).

Zarządzanie pamięcią jest realizowane z wykorzystaniemautomatycznego odśmiecania.

Obecnie są w użyciu dwie linie języka: Python 2.x (najnowsza wersja2.7.11) i Python 3.x (najnowsza wersja 3.5.1).

Najważniejsze implementacje to CPython, IronPython, Jython i PyPy.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 5 / 228

Page 6: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Ruby

Został stworzony w 1995 roku przez Japończyka Yukihiro Matsumoto.

Popularność poza Japonią zdobył dzięki frameworkowi Ruby on Rails.

Implementacje są interpreterami.

Jest dynamicznym językiem obiektowym (wszystko jest obiektem) zwsparciem dla programowania funkcyjnego i strukturalnego.

Jest językiem bardzo elastycznym - przede wszystkim dziękimożliwość podmiany zachowania obiektów w czasie uruchomieniaprogramu - nawet typów wbudowanych.

Posiada automatyczne odśmiecanie pamięci.

Najnowszą wersją języka jest 2.3.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 6 / 228

Page 7: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Tcl

Tcl (Tool Command Language) został stworzony przez JohnaOutershouta.

Jest interpretowanym językiem dynamicznym.

Jest używany jako język rozszerzeń, skryptów powłoki itp.

Jest ściśle zintegrowany z biblioteką graficzną Tk (Tcl/Tk).

Umożliwia przenoszenie oprogramowania na różne platformy (Unix,Linux, Windows).

Najnowsza wersja pochodzi z 2015 roku (8.6.4).

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 7 / 228

Page 8: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Perl

Perl powstał w 1987 roku, został stworzony przez Larry’ego Walla.

Perl jest wysokopoziomowym językiem interpretowanym.

Jest używany przede wszystkim do przetwarzania plików tekstowych,wykonywania operacja na powłoce, a także jako język rozszerzeń.

Jest wieloplatformowy.

Najnowsza wersja 5.18.2 pochodzi z stycznia 2014 roku.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 8 / 228

Page 9: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Lua

Lua została stworzona przez Roberto Ierusalimschy-ego, LuizaHenrique de Figueiredo i Waldemara Celesa w 1993.

Lua jest szybkim, lekkim językiem skryptowym.

Jest językiem dynamicznie typowanym.

Jest często używana do tworzenia skryptów dla gier.

Uruchamiana na maszynie writualnej z odśmiecaniem pamięci.

Najnowsza wersja 5.3.2

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 9 / 228

Page 10: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Podstawowa trójka internetowa

Podstawą każdej większej strony internetowej są:

HTML - specyfikacja zawartości strony

CSS - specyfikacja wyglądu strony

JavaScript - specyfikacja zachowania strony.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 10 / 228

Page 11: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

JavaScript - ogólna charakterystyka

JavaScript - wysokopoziomowy, dynamiczny, słabo typowanyinterpretowany język programowania.

Zawiera wsparcie dla obiektowego i funkcyjnego stylu programowania.

Jest wspierany przez najważniejsze przeglądarki.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 11 / 228

Page 12: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Składowe JavaScript

Rdzeń - ECMAScript - opisuje składnię i semantykę języka (nie sąopisywane szczegóły związane z przeglądarką).

DOM (Document Object Model) - API dla XML, które zostałorozszerzone do użycia z HTML. DOM opisuje stronę jako hierarchięwęzłów.

BOM (Browser Object Model) - API umożliwiające dostęp i zmianyokna przeglądarki (przesuwanie, otwieranie, zamykanie).

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 12 / 228

Page 13: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Historia JavaScript

Język został stworzony przez Brendona Eicha w firmie Netscape w1995.

Oryginalną nazwą była Mocha, potem LiveScript a na końcu puuzyskaniu pozwolenia od firmy Sun JavaScript.

Język jest ustandaryzowany przez ECMA (1996) - w standardzie nosinazwę ECMAScript (innym językiem, który spełnia ten standard zrozszerzeniami jest ActionScript).

Najnowszą edycją standardu ECMAScript jest wersja 5.1 (czerwiec2011).

Następną wersją będzie wersja 6(Harmony lub ES.next).

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 13 / 228

Page 14: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Narzędzia wspierające budowę oprogramowania

JSFiddle - aplikacja online pozwalająca na uruchamianie i testowaniekodu http://jsfiddle.net/ (darmowe).

Firebug - dodatek do Firefoxa - pozwala na testowanie i debugowaniekodu (darmowe).

Aptana - oparte o Eclipse środowisko programowania aplikacji web(darmowe).

WebStorm - środowisko programowania aplikacji web (niestetykomercyjne).

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 14 / 228

Page 15: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Osadzenie kodu w przeglądarce

W dokumencie HTML można umieścić skrypt JavaScript pomiędzyznacznikami <script> i </script>.

< s c r i p t l a n g u a g e="JavaScript">//...//Treść skrytpu JavaScript//...</ s c r i p t >

Można się również odwoływać do zewnętrznych plików z kodemJavaScript:

< s c r i p t s r c="p.js" t y p e="text/javascript"l a n g u a g e="JavaScript"></ s c r i p t >

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 15 / 228

Page 16: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Podstawowe elementy I

Programy JavaScript zapisuje się używając Unicode.

Jest rozróżniana wielkość liter - np. A i a są różnymi identyfikatorami.

Białe znaki (spacja, tabulacja itp.) są z reguły pomijane w trakcieanalizy leksykalnej.

Jedynym wyjątkiem są znaki nowego wiersza, które mogą byćseparatorami instrukcji, gdy można jednoznacznie określić, gdzieinstrukcja się kończy.

Opcjonalnymi separatorami instrukcji są znaki średnika.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 16 / 228

Page 17: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Komentarze

Komentarze są takie jak w Javie i C++.

Jednolinijkowe są zapisywane pomiędzy znakami // i znakiem nowegowiersza.

Wielolinijkowe komentarze są zapisywane pomiędzy znakami /* i */.

Na przykład:

//Komentarz jednlinijkowyvar x = 1 0 ;/*Komentarz zajmującywiele linii*/

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 17 / 228

Page 18: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Podstawowe typy I

Liczby

1201 . 0. 51 . 2 E2

Wartości logiczne

truef a l s e

Łańcuchy znaków

"Stała łańcuchowa"’Inna stała łańcuchowa’

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 18 / 228

Page 19: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Podstawowe typy II

Data i czas

var d1 = new Date (2014 , 1 , 13) ;var d2 = new Date (2014 , 1 , 14 , 10 , 0 , 0) ;

Wyrażenia regularne - składnia Perla

var s t r = "Liczby: 1, 2, 3" ;var wzorzec = /d+/g ;wzorzec . t e s t ( s t r ) ;s t r . s e a r c h ( wzorzec ) ;s t r . match ( wzorzec ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 19 / 228

Page 20: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Obiekty I

Obiekty są nieuporządkowaną kolekcją właściwości, które zawierająwartości typów podstawowych, innych obiektów lub funkcji.

Każda z właściwości obiektu posiada swoją własną nazwę.

Nazwy właściwości mogą być łańcuchami znaków zawierającymispacje.

Obiekty JavaScript (podobnie jak w Pythonie) są dynamiczne -można dodawać i usuwać z nich właściwości.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 20 / 228

Page 21: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Obiekty II

var s t u d e n t = {na zwi s ko : "Kosmyk" ,w iek : 22 ,"numer indeksu" : 11212

daneOsobowe : funct ion ( ) {return th i s . n azw i sko + t h i s . w iek + t h i s [ "

numer indeksu" ] ;}

}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 21 / 228

Page 22: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Tablice I

Tablica jest uporządkowaną kolekcją wartości.

Tablice JavaScript są specjalnym rodzajem obiektów, nazwamiwłaściwości są kolejne liczby całkowite (licząc od zera).

Elementy tablicy w JavaScript mogą mieć dowolny typ (nawet różny).

Dostęp do elementów jest realizowany za pomocą operatoraindeksowania.

Liczbę elementów tablicy można określić za pomocą własności length.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 22 / 228

Page 23: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Tablice II

var tab1 = [ 1 , 2 , 3 , 4 ] ;var tab2 = [ 1 , true , "x" ] ;var tab3 = new Array ( 2 0 ) ;

f o r ( var i = 0 ; i < tab . l e n g t h ; ++i )tab1 [ i ] = 1 2 ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 23 / 228

Page 24: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wartości null i undefined

Słowo null reprezentuje wartość specjalną używaną do zaznaczeniabraku konkretnej wartości (jak null w Javie).Słowo undefined również oznacza brak wartości.

jest wartością niezainicjowanej zmiennej,jest zwracane w sytuacji, gdy nie zostanie odszukana wartośćodnosząca w tablicy,jest zwracane przez funkcję, która nie ma określonego typu wartościzwracanych.

Wartość undefined jest reprezentowana przez własność obiektuglobalnego.

Poza opisaną różnicą oba słowa mogą być używane zamiennie.

nu l l == undefined ; //truenu l l === undefined ; //false

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 24 / 228

Page 25: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Obiekty globalne

Obiekt globalny jest obiektem dostarczającym własności dostępne dlacałego programu JavaScript.W czasie startu interpretera są tworzone własności obiektuglobalnego:

globalne właściwości takie jak undefined, Infinity, NaN.funkcje globalne - np. isNan(), parseInt().konstruktory np. Date(), RegExp(), String() itd.obiekty globalne jak Math i JSON.

W kodzie najwyższego poziomu, który nie jest częścią funkcji, możnaużyć słowa kluczowego this do odwołania do obiektu globalnego.

Dla aplikacji klienckich obiekt Window dostarcza obiektu globalnegoobject dla kodu JavaScript zawartego w oknie przeglądarki.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 25 / 228

Page 26: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Zmienne

Nazwa identyfikatora zmiennej lub funkcji musi się zaczynać od liter(w tym Unicode), podkreślenia lub znaku dolara, po którym możenastąpić sekwencja liter, cyfr, znaków podkreślenia lub dolara.

Słowa kluczowe: break, case, catch, continue, default, debugger,delete, do, else, false, finally for, function, if, in, instanceof, new, null,return, switch, this, throw, true, try, typeof var, void, while.

Słowa zarezerwowane: class, const, enum, export, extends, import,super.

W trybie strict są również zarezerwowane: implements, interface, let,package, private, protected, public, static, yield.

Niedozwolone jest używanie identyfikatorów: arguments i eval.

ECMAScript 3 rezerwuje wszystkie słowa kluczowe Javy.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 26 / 228

Page 27: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Deklaracje zmiennych

Zmienne przed użyciem powinny być zadeklarowane.

Do deklaracji zmiennej używa się słowa kluczowego var, deklaracjamoże być połączona z inicjowaniem zmiennej.

var x ;var i , j ;var y = "kot" ;

Zmienne mogą przechowywać wartości różnych typów (nie jest donich przypisany określony typ po definicji).

var x = 1 . 0 ;x = "pies" ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 27 / 228

Page 28: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Zasięg widoczności zmiennych I

Zasięg widoczności zmiennej zależy od miejsca definicji:obiekty globalne są widoczne w całym programieobiekty zdefiniowane w funkcjach (lokalne) są widoczne jedynie w cielefunkcji, w której zostały umieszczone.

Zmienne są widoczne nawet przed swoją deklaracją, są przytwierdzonedo początku funkcji (ang. hoisting).

Funkcje mogą być zagnieżdżone - każda funkcja ma własny zasięglokalny.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 28 / 228

Page 29: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Zasięg widoczności zmiennych II

JavaScript nie posiada zasięgu blokowego (w przeciwieństwie doC++)

var k = 0 ;i f ( i == 10) {var m = 1 5 4 ;f o r ( var l = 0 ; l < 5 ; ++l ) {

//...}//l nadal widoczne

}//m zdefiniowane , ale nie musi być zainicjowane.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 29 / 228

Page 30: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wyrażenia i operatory I

Operatory arytmetyczne:jednoargumentowe operatory +, −, ++, −−,mnożenie ∗,dzielenie /,dzielenie modulo % (działa także dla liczb zmiennoprzecinkowych),dodawanie + (i operator konkatenacji),odejmowanie −,

Operatory bitowe:bitowa koniunkcja &,bitowa alternatywa |,bitowa alternatywa wyłączająca (xor) ^,bitowe zaprzeczenie ~,przesunięcie bitowe w lewo <<,przesunięcie bitowe w prawo ze znakiem >> (bity z lewej strony sąwypełniane bitem znaku),przesunięcie bitowe w prawo >>> (bity z lewej strony zawsze zerowe),

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 30 / 228

Page 31: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wyrażenia i operatory II

Operatory relacyjne:równość i nierówność - operatory ==, ===, !=, !==.

Operator === jest operatorem identyczności, działa jak ==, ale bardziejrygorystycznie oprócz sprawdzania wartości operandów sprawdzany jestrównież ich typ, nie są wykonywane żadne konwersje typów.

"1" == t rue //true"1" === t rue //false1 .0 == 1 //true1 .0 === 1 //true - ten sam typ Number

Operatory porównania - <, >, <=, >=

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 31 / 228

Page 32: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wyrażenia i operatory III

Operator in - zwraca prawdę w wtedy i tylko wtedy, gdy wartośćzapisana po lewej stronie jest nazwą właściwości obiektu zapisanegopo prawej stronie (przy czym wartość stojąca po lewej stronie musibyć łańcuchem znaków lub dać się do tego łańcucha znakówskonwertować).

var o b j = {a : 1 2} ;"a" i n o b j ; //true"x" i n o b j ; //false

Operator instanceof - zwraca prawdę wtedy i tylko wtedy gdyobiekt stojący po lewej stronie operatora jest instancją typuzapisanego po prawej stronie:

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 32 / 228

Page 33: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wyrażenia i operatory IV

var data = new Date (2014 , 1 , 1) ;data i n s tanceof Date ; //truedata i n s tanceof Number ; //falsedata i n s tanceof Object ; //true

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 33 / 228

Page 34: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wyrażenia i operatory V

Operatory logiczne:koniunkcja - &&,alternatywa - ||,zaprzeczenie - !.

Operatory przypisania - = i formy skrótowe (np. *=, +=, -= itd).

x = x + 4 ;//jest równoważnex += 4 ;

Operator warunkowy ?:

ar g > 0 ? 1 : −1;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 34 / 228

Page 35: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wyrażenia i operatory VI

Operator typeof - operator jednoargumentowy, zwraca łańcuchznaków reprezentujący typ operandu.

typeof 2 ; //"number"typeof "X" ; // "string"typeof nu l l ; //"object"typeof undefined ; //"undefined"typeof true ; //"boolean"

Operator delete - powoduje usuwanie własności obiektu lubelementu tablicy.

var o b j = {a : 1 , b : 2} ;de lete o b j . a ;var tab = [ 3 , 4 , 5 ] ;de lete tab [ 2 ] ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 35 / 228

Page 36: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wyrażenia i operatory VII

Operator void - jednoargumentowy, niezależnie od operandu zawszezwraca wartość undefined - użyteczny, gdy należy pominąć przywyświetlaniu wartości zwracane - na przykład bez wyświetlania woknie przeglądarki.

Operator przecinka - działanie takie jak w C++ - wartością zwracanąjest wartość wyrażenia z prawej strony, rzadko występuje samodzielnie- najczęściej używany w pętli for.

//Wartością wyrażenia zapisanego poniżej jest 3x = 1 , y = 2 , z = 3 ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 36 / 228

Page 37: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Instrukcje I

Instrukcja warunkowa - działanie takie jak w C++ i Javie -wartościowane wyrażenie w nawiasach okrągłych jeżeli jest prawdziweto wykonywana jest instrukcja zapisana po wyrażeniu, jeżeli jest frazaelse to jest wykonywana w sytuacji, gdy wyrażenie w nawiasachokrągłych jest wartościowane do fałszu.

i f ( x > 0)x = −x ;

i f ( y > 0) {return y ;

}e l s e {return −y ;

}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 37 / 228

Page 38: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Instrukcje II

Instrukcja wyboru - składniowo podobne do instrukcji z C++ i Javy,Wyrażenia etykiet są wartościowane w czasie uruchomienia.Etykieta może być wyrażeniem dowolnego typu.

switch ( d z i e n ) {case "poniedziałek" :

return 1 ;case "wtorek"

return 2 ;//...defau l t :return −1;

}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 38 / 228

Page 39: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Instrukcje III

Pętla while - działanie takie jak w C++, dopóki wyrażenie zapisane wnawiasach okrągłych zwraca prawdę wykonywane jest ciało pętli:

var i = 0 ;whi le ( i < 100) {

++i ;}

Pętla do while - działanie takie jak w C++, dopóki wyrażeniezapisane w nawiasach okrągłych zwraca prawdę wykonywane jestciało pętli, pętla wykonywana jest przynajmniej raz:

var i = 0 ;do {

++i ;}whi le ( i < 100)

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 39 / 228

Page 40: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Instrukcje IV

Pętla for - działanie takie jak w C++,Najpierw wykonywana jest część inicjalizacyjna, potem wykonywanyjest test, ciało pętli jeżeli test jest wartościowany do prawdy, na końcuczęść związana z modyfikacją zmiennych (np. liczników).Iteracje są wykonywane aż do momentu, gdy test zwróci fałsz (lubpętla zostanie zakończona break, return).

f o r ( var i = 0 ; i < 1 0 0 ; ++i ) {//...

}

Pętla for in = używana do przechodzenia po własnościach obiektu lubelementach tablicy.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 40 / 228

Page 41: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Instrukcje V

f o r ( var i = 0 ; i < tab . l e n g t h ; ++i )tab [ i ] = i ;

f o r ( var i i n tab )tab [ i ] = i ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 41 / 228

Page 42: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Instrukcje VI

Skoki - break, continue - działanie takie jak w Javie - możliwy zapis zetykietą do której ma przejść sterowanie po osiągnięciu tej instrukcji.

e t y k i e t a :f o r ( var i = 0 ; i < 1 0 ; ++i ) {f o r ( var j = 0 ; j < 1 0 ; ++j ) {f o r ( var k = 0 ; k < 1 0 ; ++k )i f ( tab [ k ] < 0) break e t y k i e t a ;

}}

Instrukcja powrotu - return.

Zgłoszenie wyjątku - throw.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 42 / 228

Page 43: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Instrukcje VII

Obsługa sytuacji wyjątkowych - obsługa podobna jak w Javie (aletylko jeden blok catch)

Kod, w którym może wystąpić wyjątek jest objęty blokiem try.Wyjątki są przechwytywane w bloku catch.Niezależnie od tego czy został zgłoszony jakikolwiek wyjątekwykonywany jest blok finally.

t ry {//Normalny kod}catch ( e ) {//Kod obsługi wyjątku}f i n a l l y {//Kod kończący}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 43 / 228

Page 44: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Funkcje I

Definicja funkcja rozpoczyna się od słowa kluczowego function, poktórym znajduje się zapisany w nawiasach okrągłych zbiór jejargumentów (rozdzielanych przecinkami) i ciało funkcji.

Funkcje w JavaScript nie sprawdzają, ile argumentów dostają nawejściu.

Argumenty wywołania funkcji są przechowywane w zmiennejarguments.

Kolejne argumenty można uzyskać korzystając z operatoraindeksowania.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 44 / 228

Page 45: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Funkcje II

funct ion kwadrat ( x ) {return x ∗ x ;

}funct ion kwadrat2 {return arguments [ 0 ] ∗ arguments [ 0 ] ;

}

kwadrat ( ) ;kwadrat ( 1 2 ) ;kwadrat ( 1 0 , 1 2 1 , 1 2 ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 45 / 228

Page 46: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Literatura

1 D.Flanagan ”JavaScript: The Definitive Guide” wydanie szóste,O’Reilly Media 2011

2 N.C. Zakas ”Proffesional: JavaScript for Web Developers” wydanietrzecie, John Wiley & Sons 2012

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 46 / 228

Page 47: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Funkcje jako obywatele pierwszego rzędu I

Funkcje są traktowane jako każda inna wartość:Można przekazywać funkcje do innych funkcji jako argumenty,Można zwracać jako wynik funkcję,Można definiować funkcje lokalne (zagnieżdżone),Można definiować funkcje anonimowe (nienazwane).

Funkcje przyjmujące i zwracające funkcje to funkcje wyższego rzędu.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 47 / 228

Page 48: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Funkcje jako obywatele pierwszego rzędu II

funct ion p r z y k l a d ( fun ) {funct ion l o k a l n a ( ) {

return fun ( ) ;}return l o k a l n a ;

}

f u n k c j a = p r z y k l a d ( funct ion ( ) { return 2∗2}) ;f u n k c j a ( ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 48 / 228

Page 49: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Domknięcia I

JavaScript używa zasięgu leksykalnego (statycznego).

Zasięg leksykalny oznacza, że gdy funkcja jest wykonywana używazmiennych z miejsca, w którym została zdefiniowana a nie z miejsca,w którym została wywołana.

Dla implementacji zasięgu leksykalnego konieczne jestprzechowywanie środowiska, w którym została zdefiniowana funkcja(zbiór zmiennych wpływających na zachowanie funkcji).

Połączenie obiektu funkcji z jej zasięgiem (wystarcza zbiór wiązańzmiennych wolnych) jest nazywany domknięciem (ang. closure).

Wszystkie funkcje w JavaScript są domknięciami.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 49 / 228

Page 50: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Domknięcia II

funct ion z w i e r z e ( ) {var gatunek = "orangutan" ;funct ion wewnetrzna ( ) {

a l e r t ( gatunek ) ;}

return wewnetrzna ;}//...var gatunek = "goryl" ;z w i e r z = z w i e r z e ( ) ;z w i e r z ( ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 50 / 228

Page 51: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Domknięcia III

Zmienne wolne są przekazywane przez referencję.

Jeżeli funkcja zwraca inną funkcję to przy każdym wywołaniutworzone jest inne domknięcie.

Daje to możliwość utworzenia zmiennych pomocniczych.

funct ion p r z y k l a d ( ) {var l i c z b a = 0 ;var l i c z n i k = funct ion ( ) { a l e r t (++ l i c z b a ) ;}return l i c z n i k ;}

zm = p r z y k l a d ( ) ;//1 2zm ( ) ; zm ( ) ;//1 - inne domknięciep r z y k l a d ( ) ( ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 51 / 228

Page 52: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Literały obiektowe

Literałem obiektowym jest nazywana lista rozdzielonych przecinkamipar (nazwa właściwości, wartość) umieszczona w nawiasachklamrowych.Nazwami właściwości są identyfikatory lub łańcuchy znaków.Wartością w parze są dowolne wyrażenia JavaScript.

var p u s t y = {} ;var p r o s t o k a t = {a : 1 . 0 , b : 2 . 0 } ;var a u t o r = {

i m i e : "Jan" , "drugie imie" : "Tadeusz" ,na zwi s ko : "Moziński" ,a d r e s : {

m i e j s c o w o s c : "Warszawa"}

} ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 52 / 228

Page 53: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Tworzenie obiektów z wykorzystaniem new

Instrukcja new tworzy i inicjuje nowy obiekt.

Po słowie kluczowym new musi wystąpić wywołanie funkcji -konstruktora.

Dla typów wbudowanych:

var o b i e k t = new Object ( ) ;var t a b l i c a = new Array ( ) ;var data = new Date ( ) ;var wr = new RegExp ("a+" ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 53 / 228

Page 54: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Tworzenie obiektów z wykorzystaniem Object.create()

ECMAScript 5 definiuje do tworzenia obiektów metodęObject.create().

Metoda ta tworzy nowy obiekt używając swojego parametru jakoprototypu tego obiektu.

Metoda create umożliwia przekazywanie drugiego, opcjonalnegoparametru, który opisuje właściwości nowego obiektu.

//obj odziedziczy właściwości a i bvar o b j = Object . c r e a t e ({ a : 1 , b : 2} ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 54 / 228

Page 55: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Programowanie obiektowe

Wpływ na definicję nowego typu w JavaScript mają:konstruktor - obiekt funkcji, który definiuje nazwę dla nowej klasy,właściwości dodane w konstruktorze są polami i metodami (wprzypadku podstawiania funkcji do właściwości) klasy.prototyp - część obiektu, która jest dziedziczona przez wszystkieobiekty klasy,obiekt instancji - jest instancją nowego typu, właściwości przypisane doobiektu po jego utworzeniu nie są współdzielone z innymi obiektami.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 55 / 228

Page 56: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Konstruktor I

W terminologii JavaScript konstruktor to funkcja, która jest używanado inicjowania nowego obiektu.

Konstruktor powinien być wywoływany z użyciem słowa kluczowegonew (wywołany bez new utworzy właściwość obiektu globalnego).

Każda funkcja JavaScript może być użyta jako konstruktor (pozafunkcjami zwracanymi przez metodę Function.bind() - ECMAScript5).

Właściwość prototype konstruktora jest używana jako prototypnowego obiektu - wszystkie obiekty są tworzone z wykorzystaniemjednego konstruktora i mają w ten sposób jeden typ.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 56 / 228

Page 57: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Konstruktor II

funct ion Punkt ( x , y ) {t h i s . x = x ;t h i s . y = y ;t h i s . o d l = funct ion ( ) {

return Math . s q r t ( t h i s . x ∗ t h i s . x + t h i s . y ∗t h i s . y ) ;

}}//Tworzenie instancjip1 = new Punkt ( 1 , 2 )//p2 - undefined - tylko wywołanie funkcjip2 = Punkt ( 3 , 4 )

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 57 / 228

Page 58: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Prototypy I

Każdy obiekt JavaScript posiada dwie części:wartość określającą jego zawartość,prototyp.

Wartość obiektu jest tworzona na podstawie prototypu.

Każdy literał obiektowy posiada ten sam prototyp -Object.prototype.

Prototyp może być określany z wykorzystaniem konstruktorów.

Dostęp do prototypu - Object.getPrototypeOf(obj)

Dodatkowo dostęp do prototypu (poza IE) jest możliwy zwykorzystaniem __proto__.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 58 / 228

Page 59: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Prototypy II

var P r o s t o k a t = funct ion ( a , b ) {t h i s . a = a ;t h i s . b = b ;

}

P r o s t o k a t . p r o t o t y p e . obwod = funct ion ( ) {return 2 ∗ t h i s . a + 2 ∗ t h i s . b ;

}

var p = new P r o s t o k a t ( 1 0 , 2 0 ) ;p . obwod ( ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 59 / 228

Page 60: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Prototypy III

Mechanizm tworzenia typów w oparciu o prototypy jest dynamiczny.

Obiekt dziedziczy właściwości prototypu, nawet w sytuacji, gdyprototyp zostanie zmieniony po utworzeniu obiektu.

Umożliwia to rozszerzanie typów poprzez dodawanie nowych metod.

Przedstawiony mechanizm działa również dla typów wbudowanych -można rozszerzać liczby, łańcuchy, tablice itd.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 60 / 228

Page 61: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Prototypy IV

Number . p r o t o t y p e . p r z e c i w n a = funct ion ( ) {return −t h i s ;

}var x = −1;x . p r z e c i w n a ( ) ;//Usuwa białe znaki z lewej stronyS t r i n g . p r o t o t y p e . l t r i m = funct ion ( ) {

return th i s . r e p l a c e (/ˆ\ s +/, ’’ ) ;}//x - "X "var x = " X " ;x . l t r i m ( ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 61 / 228

Page 62: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Usuwanie właściwości I

Do usuwania właściwości z obiektu służy operator delete.

Operand delete musi być wyrażeniem służącym do dostępu dowłaściwości.

Operator delete zwraca wartość prawdy, gdy usunięcie zakończyło sięsukcesem lub nie spowodowało żadnego efektu.

Można usuwać tylko właściwości własne obiektu.

Operator delete zwraca wartość fałszu, gdy operacja usunięciawłaściwości jest niemożliwa do przeprowadzenia.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 62 / 228

Page 63: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Usuwanie właściwości II

o b j = {x : "A" , y : 1 2} ;//Prawdade lete o b j . x ;//Prawdade lete o b j . x ;//Prawdade lete o b j . z ;//fałszde lete Object . p r o t o t y p e

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 63 / 228

Page 64: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Metody porównujące

Operator równości JavaScript porównuje obiekty przez referencję a nieprzez ich zawartość - obiekty są równe wtedy i tylko wtedy, gdy sątymi samymi obiektami.

Porównywanie wartości poszczególnych składowych jest możliwepoprzez zdefiniowanie i późniejsze wykorzystanie metod.

Punkt . p r o t o t y p e . e q u a l s = funct ion ( o b j ) {i f ( o b j == nu l l ) | | ( o b j . c o n s t r u c t o r !== Punkt )return f a l s e ;

return th i s . x == o b j . x && t h i s . y == o b j . y ;}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 64 / 228

Page 65: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Właściwości prywatne i uprzywilejowane I

Publiczne właściwości są deklarowane wewnątrz metod obiektu wpostaci this.nazwa.

Publiczne metody są definiowane z wykorzystaniem prototypu:

K l a s a . p r o t o t y p e . metoda = funct ion ( ) { . . . }

Prywatne zmienne są deklarowane z wykorzystaniem var, mogą byćosiągalne jedynie z wykorzystaniem funkcji prywatnych iuprzywilejowanych (nie każda jednak taka funkcja ma dostęp -wykorzystanie domknięcia).

Prywatne funkcje są definiowane wewnątrz konstruktora typu lub zapomocą konstrukcji:

var f u n k c j a = funct ion ( ) { . . . }

Właściwości statyczne są definiowane jako Klasa.nazwa = expr;.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 65 / 228

Page 66: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Właściwości prywatne i uprzywilejowane II

funct ion Kolo ( r , x0 , y0 , k o l o r ) {//Pola prywatnevar x 0 = x0 ;var y 0 = y0 ;var r = r ;

//Metoda uprzywilejowanat h i s . getR = funct ion ( ) {return r ;

}//Pole publicznet h i s . k o l o r = k o l o r ;

}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 66 / 228

Page 67: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Właściwości prywatne i uprzywilejowane III

//Metoda publiczna//Konieczne wykorzystanie metody uprzywilejowanej//przy dostępie do zmiennych prywatnychKolo . p r o t o t y p e . p o l e = funct ion ( ) {return Math . PI ∗ t h i s . getR ( ) ∗ t h i s . getR ( ) ;

}//Atrybut statycznyKolo . l i c z b a = 0k o l o = new Kolo ( 1 , 2 , 3 , "czerwony" ) ;//Atrybut instancjik o l o .m = 4 3 ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 67 / 228

Page 68: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Instrukcja with I

Dostęp do atrybutów obiektów może być skracany z wykorzystanieminstrukcji wiążącej with.

Zazwyczaj do dostępu do składowej używa się nazwy obiektu,operatora dostępu do składowej i składową:

o b j . x = 1 2 ;o b j . y = 1 0 ;

Można jednak użyc with:

with ( o b j ) {x = 1 2 ;y = 1 0 ;}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 68 / 228

Page 69: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Instrukcja with II

W praktyce with jest kłopotliwe i może prowadzić doniejednoznaczności:

with ( o b j ) {a = b ;}

Zapisaną powyżej instrukcję można interpretować jako:

o b j . a = b ;o b j . a = o b j . b ;a = o b j . b ;a = b ;

Instrukcja zaburza powiązania nazw zmiennych - spowolnienieprogramów.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 69 / 228

Page 70: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Dziedziczenie I

Dziedziczenie jest w JavaScript najczęściej z użyciem łańcuchowegołączenia prototypów:

//X <- Y <- Zfunct ion X( ) {t h i s . x = 1 0 ;t h i s . f 1 = funct ion ( ) {return "X()" ; }

}funct ion Y( ) {t h i s . y = 1 2 ;t h i s . f 2 = funct ion ( ) {return "Y()" ; }

}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 70 / 228

Page 71: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Dziedziczenie II

funct ion Z ( ) {t h i s . z = 1 4 ;t h i s . f 3 = funct ion ( ) {return "Z()" ;

}}//Implementacja dziedziczeniaY . p r o t o t y p e = new X( ) ;Z . p r o t o t y p e = new Y( ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 71 / 228

Page 72: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Tablice

W JavaScript można przechowywać w tablicy wartości różnych typów.

Tablice w JavaScript są dynamiczne - mogą zwiększać i zmniejszaćswój rozmiar w trakcie działania programu.

Indeksy w JavaScript są oparte na 32 bitowych liczbach.

Indeksy nie muszą być ciągłe (jest możliwość tworzenia tzw. tablicrzadkich).

W JavaScript tablice można traktować jako specjalny rodzaj obiektu,których właściwości są liczbami - dostęp do elementów jest jednakszybszy niż w przypadku właściwości obiektów.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 72 / 228

Page 73: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Tworzenie tablic I

Literały tablicowe - elementy rozdzielane przecinkami zapisane wnawiasach kwadratowych.

var p u s t a = [ ] ;var tab1 = [ 1 , 2 , 3 , 4 ] ;var tab2 = [ 1 , f a l s e , 1 . 1 , "x" ] ;var tab3 = [ [ 1 , 2 . 0 ] , 1 2 ] ;var tab4 = [{ a : 1 , b : 2 } , [ 1 , 2 ] ] ;var tab5 = [ 1 , , 2 ] ;//Rozmiar tab6 3 a nie 4 - dopuszczalny jest//zapis dodatkowego nadmiarowego przecinkavar tab6 = [ , , , ] ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 73 / 228

Page 74: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Tworzenie tablic II

Tworzenie tablic z wykorzystaniem konstruktora tablicowegotablica pusta:

var tab1 = new Array ( ) ;

tablica o określonym rozmiarze - rezerwuje tylko pamięć nie sątworzone elementy ani właściwości. Rozmiarem może być zmienna:

var n = 1 0 ;var tab2 = new Array ( n ) ;

jawne przekazanie elementów do konstruktora (musi być więcej niżjeden element):

var tab3 = new Array ( 1 , 2 , 3 , 4 , 5 ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 74 / 228

Page 75: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Dostęp do elementów tablic I

Dostęp do elementów tablicy jest realizowany z wykorzystaniemoperatora indeksowania.

Dostęp do nieistniejących indeksów nie skutkuje błędem, lecz zwracawartość undefined;

var tab = [ 1 , 2 ] ;tab [ 1 0 ]tab [−2]

Zapis do elementu pod nieistniejącym indeksem skutkuje powstaniemnowego elementu w tablicy.

var tab = [ 1 , 2 ] ;tab [ 1 0 ] = 1 0 0 ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 75 / 228

Page 76: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Dostęp do elementów tablic II

Indeksem są z reguły dodatnie liczby całkowite - ale są równieżdopuszczalne inne wartości:

łańcuchy znaków - jeżeli da się go skonwertować do liczby to jestużywany jako indeks, jeżeli nie jest tworzona właściwość o takiejnazwie.liczba ujemna - tworzona jest właściwość o nazwie będącej łańcuchemprzechowującym znakową reprezentację tej liczby.liczba rzeczywista - jeżeli nie posiada części ułamkowej to jesttraktowana jako indeks, w przeciwnym razie zasady są takie same jakdla liczby ujemnej.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 76 / 228

Page 77: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Dostęp do elementów tablic III

tab = [ 1 , 2 ] ;//tworzona jest właściwość "1.2"tab [ 1 . 2 ] = 1 0 ;//element o indeksie 100tab [ "100" ] = 1 2 ;//tworzona jest właściwość "-1.2"tab [ −1 . 2 ] = 1 2 0 ;//tworzona jest właściwość "-1"tab [−1] = 1 2 ;//dostęp do drugiego elementutab [ 1 . 0 ] = 1 0 ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 77 / 228

Page 78: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Rozmiar tablicy I

Liczbę elementów w tablicy gęstej można poznać za pomocąwłaściwości length.

W przypadku tablic rzadkich zwróci o jeden większy maksymalnymożliwy indeks.Właściwość daje się ustawiać

w przypadku mniejszych wartości od bieżącego rozmiaru nadmiaroweelementy są usuwane,w przypadku większych wartości od bieżącego rozmiaru zmienia siętylko wartość właściwości, nie są dostawiane żadne dodatkoweelementy.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 78 / 228

Page 79: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Rozmiar tablicy II

//tab.length == 3tab = [ 1 , 2 , 3 ]//length wynosi 2, ale nie ma żadnych elementówtab2 = [ , , ]//length wynosi 5, ale nie ma żadnych elementówtab3 = new Array ( 5 ) ;//length po wykonaniu tych instrukcji wynosi 11,//Jest tylko jeden elementtab4 = [ ]tab4 [ 1 0 ] = 1 2 ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 79 / 228

Page 80: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Rozmiar tablicy III

tab5 = [ 1 , 2 , 3 , 4 ] ;//Nadal tylko 4 elementytab5 . l e n g t h = 1 0 ;//Teraz już tylko 3tab5 . l e n g t h = 3 ;//Teraz tablica pustatab5 . l e n g t h = 0 ;//Odpowiednik tab5 = new Array(20);//Nie są tworzone elementytab5 . l e n g t h = 2 0 ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 80 / 228

Page 81: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Iterowanie elementów tablicy I

Najczęściej przechodzi się po elementach tablicy z wykorzystaniempętli for w postaci:

var tab = [ 1 , 2 , 3 , 4 ] ;f o r ( var i = 0 ; i < tab . l e n g t h ; ++i ) {

c o n s o l e . l o g ( tab [ i ] ) ;}//lub wersja szybszavar tab = [ 1 , 2 , 3 , 4 ] ;var r o z m i a r = tab . l e n g t h ;f o r ( var i = 0 ; i < r o z m i a r ; ++i ) {

c o n s o l e . l o g ( tab [ i ] ) ;}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 81 / 228

Page 82: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Iterowanie elementów tablicy II

W sytuacji, gdy konieczne jest pominięcie elementówniezdefiniowanych lub nieistniejących, należy dodać dodatkowy testna te wartości (w komentarzu pominięcie również wartości null):

var tab = [ 1 , , 3 , 4 ] ;f o r ( var i = 0 ; i < tab . l e n g t h ; ++i ) {// if(!tab[i]) continue;i f ( tab [ i ] === undefined ) c o n t i n u e ;c o n s o l e . l o g ( tab [ i ] ) ;

}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 82 / 228

Page 83: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Iterowanie elementów tablicy III

Należy unikać pętli for - in - wynika to z tego, że będą równieżwyświetlane wartości odziedziczone po Array.prototype.

Można je jednak odfiltrować za pomocą:

f o r ( var e l i n tab ) {i f ( ! tab . hasOwnProperty ( e l ) )

c o n t i n u e ;c o n s o l e . l o g ( e l ) ;

}

Nie ma gwarancji, w jakim porządku będą wyświetlane elementy!

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 83 / 228

Page 84: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Metody tablic I

concat() - tworzy i zwraca nową tablicę złożoną z połączonejpierwotnej tablicy i argumentów. Spłaszcza najbardziej zewnętrznetablice przekazywane w ten sposób (ich elementy są wstawiane jakokolejne elementy nowej tablicy).

var tab = [ 1 , 2 , 3 ] ;//Zwraca [1,2,1,2]tab . c o n c a t ( 1 , 2 ) ;//Zwraca [1,2,1,2]tab . c o n c a t ( [ 1 ] , [ 2 ] ) ;//Zwraca [1,2,1,[2]]tab . c o n c a t ( [ 1 ] , [ [ 2 ] ] ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 84 / 228

Page 85: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Metody tablic II

indexOf() i lastIndexOf() zwracają indeks pierwszego (lubostatniego) wystąpienia określonej parametrem wartości (lub -1, jeżelielementu o takiej wartości nie ma w tablicy):

var tab = [ 1 , 2 , 3 , 4 ] ;tab . i n d e x O f ( 2 ) ; //1tab . i n d e x O f ( 1 0 ) ; //-1

join() - łączy elementy tablicy w łańcuch znaków (opcjonalnyparametr - separator):

var tab = [ 1 , 2 , 3 , 4 ] ;tab . j o i n ( ) ; //’1,2,3,4’tab . j o i n (" " ) ; //’1 2 3 4’

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 85 / 228

Page 86: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Metody tablic III

slice() - tworzy wycinek tablicy - tablicę zawierającą elementypodane indeksami.

toString() - tworzy łańcuch reprezentujący tablicę i jej elementy.

pop() - usuwa ostatni element tablicy i zwraca go.

push() - dodaje nowy element (elementy) na koniec tablicy i zwracanową długość tablicy.

reverse() - odwraca kolejność elementów tablicy.

sort() - sortuje zawartość tablicy.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 86 / 228

Page 87: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Metody tablic IV

every() - zwraca prawdę, jeżeli wszystkie elementy spełniająpredykat.

filter() - tworzy nową tablicę zawierająca elementy, które pasujądo filtra. parametr funkcję.

shift() - usuwa i zwraca pierwszy element tablicy,

some() - zwraca prawdę, jeżeli choć jeden element spełnia predykat.

unshift() - dodaje jeden lub więcej elementów na początek tablicy,zwraca nową długość tablicy.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 87 / 228

Page 88: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Metody tablic V

forEach() - wywołuje określoną parametrem funkcję na każdymelemencie tablicy:

var tab = [ 1 , 2 , 3 ] ;//tab == [1,4,9]tab . f o r E a c h ( funct ion ( x , i , t ) { t [ i ] = x ∗ x ; } ) ;var sum = 0[ 1 , 2 , 3 ] . f o r E a c h ( funct ion ( x ) {sum += x}

map() - tworzy nową tablicę zawierającą elementy, które uzyskanoaplikując przekazywaną jako argument funkcję do każdego elementupierwotnej kolekcji:

var tab1 = [ 1 , 2 , 3 ] ;//tab2 == [1,4,9]var tab2 = tab1 . map( funct ion ( x ) { return x ∗ x ;}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 88 / 228

Page 89: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Metody tablic VI

reduce() i reduceRight() - łączą kolejne elementy tablicy zużyciem przekazywanej funkcji - tworzy się w ten sposób pojedyncząwartość. Funkcja reduce() łączy elementy do najniższego indeksu, zaśreduceRight() od najwyższego.

var tab = [ 1 , 2 , 3 , 4 ] ;//suma == 10var suma = tab . r e d u c e ( funct ion ( x , y ) { return x +

y ;} , 0) ;//suma2 == 10var suma2 = tab . r e d u c e R i g h t ( funct ion ( x , y ) {return x + y ; } , 0 ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 89 / 228

Page 90: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Metody tablic VII

//t1 == [1,2,3,4]var t1 = tab . r e d u c e ( funct ion ( x , y ) { return x .

c o n c a t ( y ) ;} , [ ] ) ;//t2 == [4,3,2,1]var t2 = tab . r e d u c e R i g h t ( funct ion ( x , y ) { return x

. c o n c a t ( y ) ; } , [ ] ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 90 / 228

Page 91: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wyrażenia regularne I

Wyrażenie regularne jest obiektem opisującym ciąg znaków.

Wyrażenia regularne są użyteczne przy wyszukiwaniu ciągów znakówlub zamiany ciągów znaków

W JavaScript wyrażenia regularne opisuje typ RegExp.

JavaScript implementuje składnię wyrażeń regularnych Perla(większość elementów została przejęta z tego języka).

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 91 / 228

Page 92: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wyrażenia regularne II

Wyrażenia regularne definiuje się korzystając z ukośnika (slash /) lubz konstruktora typu:

var wzorzec = /ˆA/ ;var wzorzec2 = new RegExp ("^A" ) ;

Dopuszczalne jest użycie flag:i - dopasowanie niezależne od wielkości liter,g - wyszukanie wszystkich dopasowań a nie tylko jednego,m - tryb wieloliniowy.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 92 / 228

Page 93: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Klasy znaków

Symbol Co dopasowuje[...] Dowolny znak w nawiasach[^...] Dowolny znak niewymieniony w nawiasach. Dowolny znak (oprócz znaku nowego wiersza)\w Znak ASCII (cyfra, litera, znak podkreślenia)\W Znak, który nie jest znakiem ASCII.\s Biały znaku Unicode.\S Dowolny znak, który nie jest białym znakiem Unicode\d Cyfra ASCII\D Dowolny znak różny od cyfry ASCII.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 93 / 228

Page 94: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Powtórzenia

Symbol Znaczenie{n,m} Dopasowanie co najmniej n razy, lecz nie więcej niż m{n,} Dopasowanie n lub więcej razy{n} Dopasowanie dokładnie n razy? Opcjonalne dopasowanie+ Dopasowanie jeden lub więcej razy* Dopasowanie zero lub więcej razy.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 94 / 228

Page 95: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Grupowanie i alternacja

Symbol Znaczenie| Dopasowanie do prawego lub lewego podwyrażenia(...) Grupowanie i numerowanie - zapamiętana grupa może być póź-

niej użyta(?:...) Tylko grupowanie\num Dopasowanie do tych samych znaków jak w przypadku grupy

num

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 95 / 228

Page 96: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Dopasowanie do określonej pozycji

Symbol Znaczenie^ Dopasowanie do początku linii lub łańcucha$ Dopasowanie do końca linii lub łańcucha\b Dopasowanie do granicy słowa\B Dopasowanie do pozycji, która nie jest granicą słowa(?= p) Pozytywne przeglądanie do przodu - wymagane dopasowanie

do ciągu, ale ciąg nie jest konsumowany(?! p) Negatywne przeglądanie do przodu - wymagany brak dopaso-

wania do ciągu, ciąg nie jest konsumowany

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 96 / 228

Page 97: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Przykłady I

/\d{1 ,4}/ //"1" "12" "1234"/\d{4}/ //"1234"/\ s+domek\ s ∗/ //" domek" " domek "// "for" ale nie "forma", "bufor", "aforyzm"/\ b f o r \b | \ b i f \b | \ b w h i l e \b/// ’a’ "b"/ ( [ ’"])[^’"]*\1/

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 97 / 228

Page 98: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Metody łańcuchów współpracujące z wyrażeniamiregularnymi I

Z wyrażeniami regularnymi współpracują metody łańcuchówznakowych - search(), replace(), match() i split().

Metoda search() umożliwia odszukanie indeksu, od któregorozpoczyna się wyraz dopasowujący do danego wyrażenia regularnego(lub -1, jeżeli takiego nie znajdzie):

"MOLEK" . s e a r c h ( / [AO] l e k / i ) ; //1

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 98 / 228

Page 99: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Metody łańcuchów współpracujące z wyrażeniamiregularnymi II

Metoda replace() zwróci łańcuch, w którym zastąpi wyrazdopasowujący do określonego wyrażenia regularnego ciągiemprzekazanym jako drugi argument (dozowolone jest użycie znaku $, zaktórym następuje cyfra):

var t e k s t = "a b c d e" ;//Zwróci "a, b, c, d, e"t e k s t . r e p l a c e ( / (\ s+)/g , ’,$1);

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 99 / 228

Page 100: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Metody łańcuchów współpracujące z wyrażeniamiregularnymi III

Metoda match() - umożliwia przekazanie jako argument wyrażeniaregularnego i zwraca tablicę zawierającą wyniki dopasowania(rozróżnia globalne i nieglobalne przeszukiwanie).

t e k s t = "[email protected]"//[ ’[email protected]’, ’abc’, ’gmail.com’,// index: 0, input: ’[email protected]’ ]t e k s t . match ( / (\w+)@(\S+)/)//[ ’[email protected]’ ]t e k s t . match ( / (\w+)@(\S+)/g )

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 100 / 228

Page 101: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Metody łańcuchów współpracujące z wyrażeniamiregularnymi IV

Metoda split() umożliwia podział łańcucha znaków względemgranicy określonej wyrażeniem regularnym (zwraca tablicę łańcuchówznaków):

var t e k s t = "1234 456 789 11223" ;//[ ’1234’, ’456’, ’789’, ’11223’ ]t e k s t . s p l i t (/\ s +/) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 101 / 228

Page 102: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Metody wyrażeń regularnych I

Typ RegExp definiuje dwie metody pozwalające na wykonywanieoperacji z wykorzystaniem wzorców - exec(), test().Działanie metody exec() - działa podobnie jak match(), ale zwracatablicę znaków o takiej samej postaci - ustawiane są właściwościindex i lastIndex.

W przypadku wyszukiwania globalnego, w kolejnej iteracji dopasowaniezaczyna się od pozycji lastIndex.

Metoda test() pozwala na sprawdzenie czy dane wyrażenieregularne dopasowuje do jakiegoś fragmentu łańcucha znaków(zwraca wartość logiczną).

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 102 / 228

Page 103: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Metody wyrażeń regularnych II

var t e k s t = "JavaScript jest bardziej zakręcony\od języka Java" ;var wzorzec = / Java /g ;var wynik ;whi le ( ( wynik = wzorzec . e x e c ( t e k s t ) ) != nu l l ) {

c o n s o l e . l o g ( wynik [ 0 ] ) ;}

wzorzec . t e s t ( t e k s t ) ; //true

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 103 / 228

Page 104: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Nowości w JavaScript 6 I

Zasięg blokowyECMAScript 5

var tab = [ ] ;f o r ( var i = 0 ; i < 5 ; ++i ) {

tab [ i ] = funct ion ( ) {c o n s o l e . l o g ("Numer" + i ) ;

} ;}//Numer 4tab [ 2 ] ( ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 104 / 228

Page 105: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Nowości w JavaScript 6 II

ECMAScript 6

var tab = [ ] ;f o r ( var i = 0 ; i < 5 ; ++i ) {

l e t nr = i ;tab [ i ] = funct ion ( ) {

c o n s o l e . l o g ("Numer" + nr ) ;} ;

}//Numer 2tab [ 2 ] ( ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 105 / 228

Page 106: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Nowości w JavaScript 6 III

Stałe

c o n s t EULER = 0 . 5 7 2//Nie powiedzie sięEULER = 0 . 5

Parametry domyślne funkcji

funct ion fun ( x , y ) {i f ( x === undefined ) x = 1 ;i f ( y === undefined ) y = 2 ;return x + y ;

}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 106 / 228

Page 107: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Nowości w JavaScript 6 IV

Iteratory i for..of

l e t f i b o n a c c i = {[ Symbol . i t e r a t o r ] ( ) {

l e t p r e = 0 , c u r = 1 ;return {

n e x t ( ) {[ pre , c u r ] = [ cur , p r e + c u r ] ;return { done : f a l s e , v a l u e : c u r }

}}

}}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 107 / 228

Page 108: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Nowości w JavaScript 6 V

f o r ( var n o f f i b o n a c c i ) {i f ( n > 1000)break ;

c o n s o l e . l o g ( n ) ;}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 108 / 228

Page 109: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Nowości w JavaScript 6 VI

funct ion fun ( x , y ) {x = x | | 1 ;y = y | | 2 ;

}

funct ion fun ( x = 1 , y = 2) {return x + y ;

}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 109 / 228

Page 110: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Nowości w JavaScript 6 VII

Skrócony zapis funkcji anonimowych (ang. arrow function)

var kwadrat = x => x ∗ x ;var p r o s t o k a t = ( a , b ) => a ∗ b ;

tab . f o r E a c h ( v => {i f ( v % 5 === 0)

wynik . push ( v ) })

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 110 / 228

Page 111: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Nowości w JavaScript 6 VIII

Klasy

c l a s s Punkt {c o n s t r u c t o r ( x , y ) {t h i s . x = x ;t h i s . y = y ;

}d l u g o s c ( ) {return Math . s q r t ( x ∗ x + y ∗ y ) ;

}}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 111 / 228

Page 112: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Nowości w JavaScript 6 IX

Dziedziczenie

c l a s s F i g u r a {c o n s t r u c t o r ( x , y ) {

//...}

}c l a s s Kwadrat e x t e n d s F i g u r a {

c o n s t r u c t o r ( x , y , a ) {s u p e r ( x , y ) ;//...

}}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 112 / 228

Page 113: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Document Object Model I

Document Object Model (w skrócie DOM) jest podstawowym API doreprezentacji i modyfikacji zawartości dokumentów HTML i XML.

Zagnieżdżona struktura dokumentów HTML lub XML jestreprezentowana w DOM za pomocą drzewa obiektów.

Drzewo reprezentuje dokument w postaci węzłów przedstawiającychtagi HTML (np <body>,<b>) i węzłów reprezentujących tekst.

Korzeniem całego drzewa jest dokument jako całość.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 113 / 228

Page 114: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Document Object Model II

<html><head>

<title>Przykład</title></head><body>

<h1>Nagłówek</h1><p>Zawartość <b>strony</b> </p>

</body></html>

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 114 / 228

Page 115: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Document Object Model III

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 115 / 228

Page 116: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Rodzaje węzłów DOM

Dokument - DocumentHTMLDocument

Dane znakowe - CharacterDataText - tekst,Comment - komentarz.

Elementy - ElementHTMLElement

HTMLHeadElementHTMLBodyElementHTMLTableElement...

Atrybuty - Attr - reprezentują atrybuty elementów

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 116 / 228

Page 117: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Atrybuty węzłów - trawersacja DOM I

Najważniejszymi atrybutami węzłów są:

parentNode - zawiera węzeł rodzicielski (lub null dla węzłów, którenie mają rodzica),

childNodes - tablica tylko do odczytu zawierająca reprezentacjewęzłów potomnych,

firstChild i lastChild - pierwszy i ostatni potomek węzła (lubnull jeśli węzeł nie posiada dzieci),

nextSibling, previousSibling - następne i poprzednie rodzeństwowęzła (węzły potomne tego samego węzła są rodzeństwem). Porządekjest określony występowaniem w dokumencie.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 117 / 228

Page 118: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Atrybuty węzłów - trawersacja DOM II

nodeType -rodzaj węzłaDocument - 9Element - 1Text - 3Comment - 8DocumentFragment - 11

nodeValue - zawartość węzła tekstowego lub komentarza (Text iComment),

nodeName - nazwa tagu elementu zapisana wielkimi literami.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 118 / 228

Page 119: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Atrybuty elementów - trawersacja DOM

Elementy przedstawiają tagi HTML - przedstawione właściwościumożliwiają przechodzenie po drzewie dokumentów bez odwiedzaniawęzłów tekstowych i komentarzy.Najważniejsze właściwości z tej grupy:

children - jest to NodeList, ale zawiera tylko obiekty Element.firstElementChild i lastElementChild - podobne jak dla węzła,ale tylko elementy.nextElementSibling i previousElementSibling - rodzeństwo,które jest elementem,childElementCount - liczba elementów potomnych (zwraca to samoco children.length).

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 119 / 228

Page 120: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wybór elementów dokumentu I

Do obiektu Document można odwołać się poprzez zmienną globalnądocument.

Przekształcanie elementów jest możliwe dopiero po uzyskaniuodpowiedniego elementu.Dostęp do elementów dokumentów jest możliwy na wiele sposobów:

za pomocą atrybutu id,za pomocą atrybuty name,za pomocą wyspecyfikowanej nazwy tagu,za pomocą wyspecyfikowanej klasy arkusza styli,za pomocą dopasowania do wyspecyfikowanego selektora CSS.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 120 / 228

Page 121: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wybór elementów dokumentu II

Wszystkie elementy dokumentu HTML posiadają atrybut id.

Wartość atrybutu id musi być unikalna wewnątrz dokumentu.

Elementy wybiera się za pomocą funkcji getElementById() obiektuDocument.

//Na przykład w funkcji obsługi zdarzeniavar x=document . getE lementBy Id ("mojNaglowek" ) ;a l e r t ( x . innerHTML ) ;//Fragment kodu HTML<h1 i d="mojNaglowek">Nag ł ówek</h1>

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 121 / 228

Page 122: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wybór elementów dokumentu III

Atrybut name był używany do nazywania elementów fomularzy, którebyły wykorzystywane przy wysyłaniu danych na serwer.

Atrybut name przypisuje nazwę dla elementu, w przeciwieństwiejednak do id nie musi być unikalny.

Wybór elementu na pomocą atrybutu name jest możliwy pozastosowaniu funkcji getElementsByName(), jest ona metodąHTMLDocument - jest więc specyficzna dla dokumentów HTML.

Wartością zwracaną przez wymienioną wcześniej metodą jest obiektNodeList, który zachowuje się jak tablica tylko do odczytu obiektówElement.

a l e r t ( document . getElementsByName ("nazwa" ) [ 0 ] .v a l u e ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 122 / 228

Page 123: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wybór elementów dokumentu IV

Możliwy jest wybór wszystkich elementów o wyspecyfikowanym typie(lub nazwie tagu) za pomocą metody getElementsByTagName().

var paragy = document . getElementsByTagName ("p" ) ;

Podobnie jak wcześniejsza metoda zwraca obiekt NodeList.

Dla dokumentów HTML nie są rozróżniane przez metodę wielkościliter.

Elementy również posiadają metodę getElementsByTagName(), alew ich przypadku są zwracane elementy, które są potomkami tegoelementu (są umieszczone wewnątrz).

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 123 / 228

Page 124: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wybór elementów dokumentu V

Atrybut class HTML is listą zawierającą identyfikatory rozdzielonespacjami.

Atrybut pozwala na definicję zbioru powiązanych ze sobą elementówdokumentu.

Atrybut ten jest wykorzystywany w połączeniu z arkuszami styli.

HTML5 definiuje metodę getElementByClassName() umożliwiającąwybór elementów dokumentu, które mają ten sam atrybut class.

Metoda zwraca obiekt NodeList.

Metoda może być używana przez elementy - umożliwiają wybórelementów potomnych, które posiadają tą samą wartość atrybutuclass.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 124 / 228

Page 125: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wybór elementów dokumentu VI

//Znajdź wszystkie elementy posiadające atrybutheader

var h e a d e r = document . getElementByClassName ("header" ) ;

//Znajdź wszystkich potomków elementu o id log,//którzy posiadają nazwę klasy error.var l o g = document . getE lementBy Id ("log" ) ;var e r r = l o g . getElementByClassName ("error" ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 125 / 228

Page 126: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wybór elementów dokumentu VII

Arkusze stylów posiadają selektory, które umożliwiają opis elementówlub zbioru elementów wewnątrz dokumentu. Np:

Element o id równym log - #log,Dowolny element <div> - div,Dowolny element z atrybutem error - .errorSelektory mogą być nawet łączone - div.warning.

Metodą umożliwiającą wybór elementów za pomocą selektorów jest -querySelectorAll().

Metoda przyjmuje łańcuch znaków zawierający selektor CSS i zwracaNodeList.

var dops = document . q u e r y S e l e c t o r A l l ("div.note, div.alert" ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 126 / 228

Page 127: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wybór elementów dokumentu VIII

Wybór pierwszego pasującego elementu do selektora jest równieżmożliwy za pomocą querySelector().

Jeżeli łańcuch znaków zawiera niepoprawny selektor to zwracany jestwyjątek.

W celu dopasowania identyfikatora lub selektora, który nie jestskładniowo poprawny z CSS (np zawiera dwukropek) znak musi byćpoprzedzony odwrotnym ukośnikiem.

Znak odwrotnego ukośnika ma w JavaScript znaczenie specjalne,dlatego musi być wprowadzony podwójnie raz jako łańcuch JavaScriptzaś drugi raz jako dla argumentu funkcji querySelector.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 127 / 228

Page 128: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wybór elementów dokumentu IX

<d i v i d="foo\bar"></d iv><d i v i d="foo:bar"></d iv>

<s c r i p t >// "#fooar"c o n s o l e . l o g (’#foo\bar’ ) ;//Nie dopasowuje do niczegodocument . q u e r y S e l e c t o r (’#foo\bar’ )

// "#foo\bar"c o n s o l e . l o g (’#foo\\bar’ ) ;// "#foo\\bar"c o n s o l e . l o g (’#foo\\\\bar’ ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 128 / 228

Page 129: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wybór elementów dokumentu X

//Dopasowuje do pierwszego divadocument . q u e r y S e l e c t o r (’#foo\\\\bar’ ) ;

//Nie dopasowuje do niczegodocument . q u e r y S e l e c t o r (’#foo:bar’ ) ;//Dopasowuje drugiego divadocument . q u e r y S e l e c t o r (’#foo\\:bar’ ) ;

</ s c r i p t >

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 129 / 228

Page 130: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Dostęp do atrybutów HTML elementów I

Każdy obiekt HTMLElement, który reprezentuje elementy dokumentuHTML definiuje właściwości, które odzwierciedlają atrybuty HTMLtego tagu.

HTMLElement definiuje uniwersalne właściwości takie jak id.

Są również specyficzne dla elementów atrybuty - np. dla obrazka src.

var o b r a z = document . getE lementBy Id ("obrazek" ) ;var o b r a z U r l = o b r a z . s r c ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 130 / 228

Page 131: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Dostęp do atrybutów HTML elementów II

Właściwości elementów, mimo że HTML nie rozróżnia wielkości literw atrybutach, zapisuje się małymi literami (wymagania składniJavaScript).

Atrybuty, które są słowami kluczowymi JavaScript poprzedza sięprzedrostkiem html - np dla for - htmlFor.

wyjątkiem dla tej reguły jest className dla atrybutu class.

Typ właściwości zależy od tego co przechowuje najczęściej są tołańcuchy znaków (ale np. dla obsługi zdarzeń Function lub null).

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 131 / 228

Page 132: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Odczyt/zapis atrybutów niestandardowych I

Typ Element definiuje także funkcje getAttribute() isetAttribute() - są one użyteczne:

do odczytu i ustawiania niestandardowych atrybutów HTML,do odczytu i zapisu atrybutów dokumentów XML.

Wartości atrybutów są zawsze traktowane jako łańcuchy znaków:

var d l g = p a r s e I n t ( o b r a z . g e t A t t r i b u t e ("width" ) ) ;o b r a z e k . s e t A t t i b u t e ("class" , "miniaturka" ) ;

Metody te mogą być również używane dla standardowych atrybutów -nazwy są zapisywane normalnie nawet dla atrybutów będącychsłowami kluczowymi JavaScript.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 132 / 228

Page 133: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Odczyt/zapis atrybutów niestandardowych II

Element definuje dodatkowe dwie metody:hasAttribute() - pozwala sprawdzić czy podany atrybut istnieje,removeAttribute() - umożliwia usunięcie atrybutu.

Dokumenty XML, które dołączają atrybuty z innej przestrzeni nazwużywają metod getAttributeNS(), setAttibuteNS(),hasAttributeNS() i removeAttributeNS() - przejmują dwaparametry:

pierwszy określaja przestrzeń nazw,drugi określa atrybut w tej przestrzeni nazw.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 133 / 228

Page 134: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Zawartość elementu I

W zależności do potrzeb zawartość elementu (content) może byćdefiniowana jako:

łańcuch HTML - łańcuch zawierający tagi HTML np.Tekst z <b>tagami</b> html,

czysty tekst - czysty łańcuch tekstowy, bez tagów HTML np. dlapowyższego łańcucha będzie to Tekst z tagami html,

węzeł typu Text - Element zawiera jako potomka tego rodzaju węzeł.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 134 / 228

Page 135: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Zawartość elementu II

Odczyt właściwości innerHTML elementu pozwala poznać zawartośćw postaci HTML.

Zapis tej właściwości wywołuje parser HTML przeglądarki i zastępujezawartość elementu nowym.

Właściwość innerHTML może być używana w dokumentach HTML iXML.

Element posiada również właściwość outerHTML - oprócz zawartościdołączone są również otwierające i zamykające tagi elementu.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 135 / 228

Page 136: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Zawartość elementu III

Czysty tekst można uzyskać za pomocą właściwości textContent.

Właściwość umożliwia uzyskanie zawartości tekstowej węzła i jegopotomków (konkatenacja).

W IE jest właściwość jest dostępna od wersji 9.

document . getElementsByTagName ("BUTTON" ) [ 0 ] .t e x t C o n t e n t ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 136 / 228

Page 137: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Modyfikacja dokumentu

Oprócz przechodzenia dokumentu i zmiany właściwości elementów iwęzłów tekstowych możliwa jest zmiana dokumentu na poziomieindywidualnych węzłów.

Dokument definiuje kilka metod do tworzenia obiektów elementów itekstowych a węzeł (Node) definiuje metody do wstawiania, usuwaniai zamiany węzłów w drzewie dokumentu.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 137 / 228

Page 138: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Tworzenie węzłów

Do tworzenia węzłów elementów służy metoda dokumentucreateElement(). Przyjmuje ona tag elementu (wielkość liter niema znaczenia w przypadku HTML, ma zaś znaczenie w XML).

var elem = document . c r e a t e E l e m e n t (’script’ ) ;

W podobny sposób są tworzone węzły tekstowe, do tego celu służymetoda createTextNode(). Przekazywany argument jestzawartością tego węzła.

var wzl = document . c reateTextNode ("Zawartość" ) ;

Do tworzenia komentarzy służy metoda createComment().

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 138 / 228

Page 139: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wstawianie węzłów

Po utworzeniu nowego węzła należy go wstawić do dokumentu zwykorzystaniem metod węzła - appendChild() lubinsertBefore().

Metoda appendChild() jest wywoływana dla elementu, do któregonależy wstawić zawartość - wstawiony węzeł będzie ostatnimpotomkiem tego elementu (lastChild).Metoda insertBefore() pobiera dwa argumenty, pierwszym jestwęzeł, który będzie wstawiany, zaś drugim argumentem jest węzeł,przed którym będzie on wstawiony (metoda jest wywoływana dlarodzica tego węzła).

Metoda może przyjmować jako drugi argument null - zachowuje sięwtedy jak appendChild().

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 139 / 228

Page 140: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Usuwanie i zastępowanie węzłów

Metoda removeChild() usuwa węzeł z drzewa dokumentu.

Metoda musi być wywołana w węźle rodzicielskim danego węzła:

node . parentNode . r e m o v e C h i l d ( node ) ;

Metoda replaceChild() zastępuje jeden węzeł innym.

Metoda musi być wywoływana dla węzła rodzicielskiego węzłazastępowanego:

node . parentNode . r e p l a c e C h i l d (document . c reateTextNode ("Zawartość" ) ,

node ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 140 / 228

Page 141: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Obiekt Window I

Obiekt Window reprezentuje okno przeglądarki,odnosi się do niego zwykorzystaniem identyfikatora window.

Obiekt Window jest obiektem globalnym.Obiekt Window definiuje szereg właściwości i metod pozwalającychna:

używanie timerów,zmianę lokalizacji przeglądanej strony,przeglądanie historii,obsługę błędów,uzyskiwanie informacji o ekranie,wyświetlanie prostych okien dialogowych,pracę z wieloma oknami i ramkami.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 141 / 228

Page 142: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Timery I

Metody obiektu Window - setTimeout() i setInterval()pozwalają na zarejestrowanie funkcji wywoływanych raz lubwielokrotnie po określonym przedziale czasu.

Metoda setTimeout() wywołuje wyszczególnioną funkcję po upływieokreślonej liczby milisekund. Metoda zwraca wartość, która może byćwykorzystana do anulowania wykonania zaplanowanej funkcji (metodaclearTimeout().

Metoda setInterval() działa podobnie jak wymieniona wcześniejsetTimeout() z wyjątkiem tego, że stale powtarza wywołanieokreślonej funkcji.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 142 / 228

Page 143: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Timery II

var myVar = s e t I n t e r v a l ( mojTimer , 1 0 0 0 ) ;

funct ion mojTimer ( ){var d = new Date ( ) ;var t = d . t o L o c a l e T i m e S t r i n g ( ) ;document . getE lementBy Id ("demo" ) . innerHTML=t ;

}

funct ion z a t r z y m a j T i m e r ( ){

c l e a r I n t e r v a l ( myVar ) ;}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 143 / 228

Page 144: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Właściwość location I

Właściwość location (obiekt Location odnosi się do adresudokumentu wyświetlanego obiektu w oknie przeglądarki.Obiekt location posiada właściwości i metody:

href - przechowuje pełny adres,hash - przechowuje część związaną z identyfikatorem fragmentu (#)host - przechowuje nazwę hosta i port,hostname - przechowuje adres hosta,port - przechowuje port,search - przechowuje fragment adresu za znakiem zapytania (częśćzapytania,assign() - ładuje nowy dokument,reload() - przeładowuje bieżący dokument,replace() - zastępuje bieżący dokument nowym.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 144 / 228

Page 145: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Historia przeglądania I

Historię przeglądarki reprezentuje właściwość history obiektuWindow.

Obiekt History jest listą dokumentów i stanów dokumentów.

Skrypty nie mają bezpośredniego dostępu do przechowywanychadresów.

Metody back() i forward() - działają jak przycisk przeglądarki <-i ->.

Metoda go() pozwala podać ile stron do przodu (lub do tyłu przyujemnych liczbach) należy przesunąć się w historii przeglądarki.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 145 / 228

Page 146: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Informacje o przeglądarce i ekranie I

Informacje o przeglądarce przechowuje właściwość navigator obiektuWindow.

Obiekt typu Navigator posiada właściwości:appName - przechowuje pełną nazwę przeglądarki,appVersion - przechowuje informacje o wersji przeglądarki,userAgent - przechowuje łańcuch jaki przeglądarka wysyła wnagłówku USER-AGENT.platform - łańcuch identyfikujący system operacyjny, na którymprzeglądarka jest uruchomiona.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 146 / 228

Page 147: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Informacje o przeglądarce i ekranie II

Właściwości ekranu (rozdzielczość, liczba kolorów) reprezentujeatrybut screen obiektu Window.

Właściwości obiektu Screen reprezentujące wysokość i szerokośćekranu w pikselach to odpowiednio height i height.

Właściwości availWidth i availHeight reprezentują wielkośćekranu pomniejszoną o piksele które zajmuje interfejs np. pasek zadań.

Głębia koloru jest reprezentowana przez colorDepth.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 147 / 228

Page 148: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Proste okna dialogowe I

Obiekt Window dostarcza trzech metod pozwalających nawyświetlanie prostych okienek dialogowych - alert(), confirm() iprompt().

Metoda alert() wyświetla wiadomość dla użytkownika aż domomentu, w którym ją zamknie.

Metoda confirm() wyświetla wiadomość i oczekuje, że użytkownikkliknie przycisk Ok lub Anuluj. W zależności od podjętej w ten sposóbdecyzji jest zwracana odpowiednia wartość logiczna.

Metoda prompt() wyświetla wiadomość i oczekuje dostarczenia przezużytkownika łańcucha znaków, zwraca tą wartość łańcucha.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 148 / 228

Page 149: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Proste okna dialogowe II

Istnieje także metoda showModalDialog() pozwalająca w okniewyświetlić dialog z sformatowaną zawartością.

Metoda ta przyjmuje jako pierwszy argument url specyfikującyzawartość okna dialogowego.

Drugim argumentem wywołania tej metody są wartości, które będądostępne dla skryptu w dialogu - dostęp do nich jest możliwy zwykorzystaniem window.dialogArguments.

Trzecim argumentem jest niestandardowa lista par przedzielanychśrednikami - pozwalają one na konfigurowanie rozmiaru i innychwłasności okna dialogowego.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 149 / 228

Page 150: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Proste okna dialogowe III

Okno wyświetlane z pomocą metody showModalDialog() jestmodalne, co oznacza, że do dalszej pracy z aplikacją (oknemprzeglądarki) konieczne jest zamknięcie go.

Okno jest wyświetlane do momentu jego zamknięcia - gdy okno jestzamykane właściwość window.returnValue staje się wartościąwywołania metody.

Okno można zamknąć programowo (przydatne dla przycisków np. Ok)za pomocą metody close() obiektu Window.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 150 / 228

Page 151: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Proste okna dialogowe IV

<body><head></head><form><fieldset id="fields"></fieldset><button onclick="akceptuj()">Potwierdź</button><script> ... </script></form></body>

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 151 / 228

Page 152: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Proste okna dialogowe V

var a r g s = d i a l o g A r g u m e n t s ;var t e x t = "<legend>Podaj imię i nazwisko </legend>"t e x t += "<label>Imię<input id=’im’></label><br/>"t e x t += "<label>Nazw.<input id=’naz’></label><br/>"document . getE lementBy Id ("fields" ) . innerHTML = t e x t ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 152 / 228

Page 153: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Proste okna dialogowe VI

funct ion a k c e p t u j ( ) {window . r e t u r n V a l u e = {} ;window . r e t u r n V a l u e . i m i e

= document . getE lementBy Id ("imie" ) . v a l u e ;window . r e t u r n V a l u e . n azw i sk o

= document . getE lementBy Id ("naz" ) . v a l u e ;window . c l o s e ( ) ;

}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 153 / 228

Page 154: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Obsługa błędów

Właściwość onerror obiektu Window jest uchwytem do funkcjiobsługi błędów - jest ona wywoływana, gdy zdarzy się nieobsłużonywyjątek - komunikat o błędzie jest wyświetlany w konsoli JavaScriptprzeglądarki.

Przypisanie do tej właściwości funkcji spowoduje, że stanie się onafunkcją obsługi błędów dla okna.

Właściwość pochodzi z okresu, gdy nie było obsługi wyjątków zwykorzystaniem bloków try - catch

Rzadko używane, przydatne do zapisu logów o błędach w czasietworzenia aplikacji.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 154 / 228

Page 155: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Literatura

1 D.Flanagan ”JavaScript: The Definitive Guide” wydanie szóste,O’Reilly Media 2011

2 https://developer.mozilla.org/en-US/docs/Web/API

3 http://www.w3schools.com/jsref/

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 155 / 228

Page 156: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Zdarzenia I

JavaScript używa asynchronicznego modelu obsługi zdarzeń.

Przeglądarka generuje zdarzenie w sytuacji, gdy wykona się cośistotnego dla dokumentu, osadzonych elementów lub przeglądarki.Na przykład zdarzenie generowane są przy:

klikinięciu przez użytkownika w przycisk,naciśnięciu przez użytkownika klawisza z klawiatury,załadowaniu całego dokumentu w przeglądarce.

Zdarzenia są obsługiwane przez zarejestrowane funkcje, które sąwywoływane, gdy określone zdarzenie zostanie zgłoszone.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 156 / 228

Page 157: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Przepływ zdarzeń DOM

Przepływ zdarzeń w DOM wyróżnia trzy fazy:fazę przechwytywania (ang. capture phase)fazę celu (ang. target phase),fazę bąbelkowania (ang. bubble phase).

W fazie przechwytywania obiekt zdarzenia jest przekazywany dokolejnych przodków widoku aż do rodzica celu.

W fazie celu obiekt zdarzenia osiąga cel zdarzenia.

W fazie bąbelkowania obiekt zdarzenia jest przekazywany w odwrotnejkolejności jak w fazie przechwytywania (od rodzica celu do widoku).

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 157 / 228

Page 158: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Rejestrowanie obsługi zdarzeń

Podstawowymi sposobami rejestrowania funkcji obsługi zdarzeń są:ustawienie właściwości obiektu lub elementu dokumentu,przekazanie funkcji obsługi zdarzeń do metod obiektu lub elementu.

Każdą z wymienionych metod można użyć w kodzie JavaScript a dlaelementów dokumentu można bezpośrednio ustawiać atrybuty wkodzie HTML.

Funkcje obsługi zdarzeń są rejestrowane przez standardową metodęaddEventListener() (w IE8 i starszych funkcja attachEvent()).

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 158 / 228

Page 159: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Obiekt zdarzenia

Obiekt zdarzenia jest przekazywany do funkcji obsługi jakopojedynczy argument tej funkcji.W ten sposób można uzyskać informacje dotyczące zdarzenia, naprzykład:

type - typ zgłoszonego zdarzenia,cancelable - pozwala sprawdzić czy zdarzenie może być wycofane,detail - dodatkowe informacje związane z zdarzeniem,bubbles - pozwala sprawdzić czy zdarzenie obsługuje fazębąbelkowania.currentTarget - element, którego funkcją obsługi zdarzeń obsługujew tej chwili zdarzenie.evenPhase - faza zdarzenia, podczas której została wywołana funkcjaobsługi zdarzenia.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 159 / 228

Page 160: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Zdarzenia związane z myszą I

Zdarzenie click - zdarzenie zgłaszane jest po zwolnieniu klawiszamyszy po kliknięciu.

Zdarzenie dbclick - zdarzenie zgłaszane jest po podwójnymwciśniśnięciu i zwolnieniu klawisza myszy (musi nastąpić wokreślonym czasie).

Zdarzenie mousedown - zdarzenie zgłaszane jest po wciśnięciuklawisza myszy.

Zdarzenie mouseup - zdarzenie występuje po zwolnieniu klawiszamyszy, jest zwykle wykorzystywane przy obsłudze mechanizmuprzeciągnij i upuść.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 160 / 228

Page 161: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Zdarzenia związane z myszą II

Zdarzenie mouseover - zdarzenie jest zgłaszane, gdy kursor najedziena określony element strony, jest wykorzystywane przy obsłudzerozwijanych menu.

Zdarzenie mouseout - jest zgłaszane po wyjściu kursora myszy pozadany element.

Zdarzenie mousemove - występuje po każdym ruchu myszy, pozwalasprawdzić bieżącą pozycję kursora na ekranie.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 161 / 228

Page 162: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Zdarzenia związane z klawiaturą

Zdarzenie keypress - jest zgłaszane po wciśnięciu klawisza zklawiatury, jest zgłaszane do momentu zwolnienia klawisza.

Zdarzenie keydown - w zależności od przeglądarki może byćobsługiwane tak jak keypress (IE, Safari, Chrome) lub być zgłaszaneraz po wciśnięciu klawisza z klawiatury (Opera, Firefox). Zdarzeniezachodzi po keypress. Jest zgłaszane dla znaków drukowalnych (niedotyczy Firefoxa).

Zdarzenie keyup - jest zgłaszane po zwolnieniu klawisza.

Zdarzenie textinput - jest wyzwalane, gdy użytkownik wprowadzitekst niezależnie od jego źródła (klawiatura, ze schowka, systemurozpoznawania mowy itp.).

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 162 / 228

Page 163: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Ajax I

Protokół HTTP specyfikuje komunikację przeglądarki z serweremwebowym.

HTTP opisuje w jaki sposób przeglądarki uzyskują dokumenty iwysyłają dane do serwera, a także w jaki sposób serwera odpowiadana uzyskane żądania.

Jest możliwe sterowanie tym procesem za pomocą JavaScript - międzyinnymi komunikacja z serwerem bez potrzeby przeładowania strony.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 163 / 228

Page 164: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Ajax II

Termin Ajax opisuje architekturę aplikacji webowych, która pozwalana pisanie skryptów sterujących HTTP.

Kluczową cechą Ajax jest wspomniana wcześniej możliwość wymianydanych z serwerem bez potrzeby przeładowania całej strony.

Ta właściwość pozwala na lepszą responsywność aplikacji webowych -użytkownik nie musi czekać na uzyskanie wszystkich danych.

Aplikacja może wczytać tylko niezbędne dane (np. nieskomplikowanąstronę startową), reszta elementów może się pojawić dopiero, gdybędzie potrzebna.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 164 / 228

Page 165: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Ajax III

Terminem uzupełniającym Ajax jest Comet - w tym przypadku serwerinicjuje komunikację i asynchronicznie wysyła komunikaty do klienta.

Do wysyłki danych serwer nie musi czekać na jawne żądania odklienta.

W Ajax klient wyciąga (pull) dane od serwera, zaś w Comet serwerpopycha (push) dane do klienta.

Ten sposób komunikacji jest możliwy z wykorzystaniem stałegopołączenia pomiędzy klientem a serwerem.

Brakuje bibliotek wspierających tego typu komunikację.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 165 / 228

Page 166: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

XMLHttpRequest I

Przeglądarki definiują API do HTTP z wykorzystaniem klasyXMLHttpRequest.

Każda instancja tej klasy reprezentuje pojedynczą parę żądanie -odpowiedź.

Metody tej klasy pozwalają na wyspecyfikowanie szczegółów żądania iwyszczególnienie danych uzyskanych w odpowiedzi.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 166 / 228

Page 167: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

XMLHttpRequest II

1 Utworzenie nowego obiektu XMLHttpRequest.

2 Specyfikacja żądania z wykorzystaniem open() podaje się metodęprzekazywania danych i URL.

3 Specyfikacja sposobu obsługi odpowiedzi serwera - np. kod obsługizdarzenia onreadystatechange.

4 Wysłanie żądania z wykorzystaniem metody send().

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 167 / 228

Page 168: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

XMLHttpRequest III

funct ion g e t C o n t e n t ( ) {var r e q u e s t = new XMLHttpRequest ( ) ;r e q u e s t . open ("GET" , "plik.txt" ) ;r e q u e s t . o n r e a d y s t a t e c h a n g e = h a n d l e r ;r e q u e s t . send ( nu l l ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 168 / 228

Page 169: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

XMLHttpRequest IV

funct ion h a n d l e r ( ) {i f ( r e q u e s t . r e a d y S t a t e == 4)i f ( r e q u e s t . s t a t u s == 200) {var e l = document . getE lementBy Id ("txt" ) ;var txtNode = document . c reateTextNode (

r e q u e s t . r e s p o n s e T e x t ) ;e l . a p p e n d C h i l d ( txtNode ) ;

}return true ;

}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 169 / 228

Page 170: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

jQuery I

JavaScript posiada rozbudowane API (szczególnie dotyczące aplikacjiklienckich), które w różnym stopniu jest wspierane przez przeglądarki.

Różnice pomiędzy przeglądarkami da się zniwelować korzystając zzewnętrznych bibliotek.

Jedną z bibliotek narzędziowych JavaScript zaprojektowanych doukrycia różnic pomiędzy przeglądarkami i uproszczenia powszechniewystępujących zadań jest jQuery.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 170 / 228

Page 171: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

jQuery II

Instalacja jQuery polega na ściągnięciu ze stronyjquery.com/downoload skryptu jquery-X.Y.Z.min.js (X, Y i Zsą zastępowane numerami wersji) i umieszczeniu go w kataloguprojektu.

Skrypt umieszcza się w kodzie za pomocą tagów:

<script src="jquery-X.Y.Z.min.js></script>

Alternatywnym sposobem jest umieszczenie adresu sieciowegozawierającego bibliotekę.

Są dostępne dwie wersje, przy czym wersja 2.X.X nie wspiera już IE wwersjach 6, 7 i 8.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 171 / 228

Page 172: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

jQuery III

Biblioteka jQuery posiada elastyczną składnię zaprojektowaną doodwoływania się do elementów dokumentu.

W ten framework wbudowano metody umożliwiające tworzeniezapytań zwracających elementy dopasowujące do określonegoselektora.

Zawiera również metody do manipulacji wybranymi elementami.

Umożliwia także stosowanie programowania funkcyjnego dowykonywania operacji na zbiorach elementów (traktowanych jakocałość).

Posiada specjalne idiomy do wyrażania sekwencji operacji.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 172 / 228

Page 173: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

jQuery IV

Biblioteka definiuje pojedynczą funkcję globalną jQuery().

Biblioteka wprowadza także skróconą nazwę tej funkcji w postaciznaku $.

Funkcja ta zwraca obiekt, który reprezentuje zbiór elementówdokumentu (wynik jQuery, zbiór jQuery, opakowany zbiór).

var e lems = $ ("div" ) ;

Na rzecz utworzonego obiektu jQuery są wywoływane odpowiedniemetody.

$ ("p.inf" ) . c s s ("bgcolor" , "red" ) . show ("fast" ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 173 / 228

Page 174: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Selektory jQuery I

Funkcja jQuery używa podobnej składni selektorów jakquerySelectorAll().

$ ("div" ) //Wszystkie div-y$ ("#komunikat" ) //Element o id komunikat$ (".submenu" )//Selektor klasy//Wszystkie odnośniki umieszczone wewnątrz//elementu o id komunikat$ ("#komunikat a" )

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 174 / 228

Page 175: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Selektory jQuery II

Użycie biblioteki daje kilka bardzo ważnych korzyści:Możliwe jest jej użycie w przeglądarkach, które nie wspierają funkcjiquerySelectorAll().Selektory CSS3 są dostępne we wszystkich przeglądarkach a nie tylko wtych, które wspierają CSS3.Obiekt tablicowy zwrócony przez jQuery jest łatwiejszy w użyciu odobiektu NodeList zwróconego przez funkcję querySelectorAll().

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 175 / 228

Page 176: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Getery i setery jQuery I

Biblioteka jQuery dostarcza możliwość operowania na atrybutachHTML, stylach CSS, zawartości elementów i geometrii elementów.

Biblioteka używa pojedynczych metod jako geterów i seterów - jeżelijest przekazywana nowa wartość do metody - to jest ona ustawian, wprzeciwnym razie zwracana bieżąca wartość atrybutu.

Ustawiane są własności dla wszystkich elementów obiektu jQueryuzyskanego z zapytania.

Zwracana jest wartość atrybutu tylko dla pierwszego elementu.

Do ustawiania wartości można przekazywać obiekt jako argument.

Dozwolone jest także przekazywanie funkcji - oblicza ona wartość jakama być ustawiona.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 176 / 228

Page 177: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Getery i setery jQuery II

Metoda attr() - pozwala na ustawianie i odczytywanie atrybutówHTML.

//Zwraca wartość atrybutu$ (’#obrazek img’ ) . a t t r ( s r c )//Pozwala ustawić wartość atrybutu$ (’#obrazek img’ ) . a t t r ( s r c , ’images/new.png’ )$ ("a" ) . a t t r ("target" , funct ion ( ) {i f ( t h i s . h o s t == l o c a t i o n . h o s t ) return "_self"e l s e return "_blank" ;

}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 177 / 228

Page 178: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Getery i setery jQuery III

Metoda css() wspiera arkusze styli.

$ ("p" ) . c s s ("font-weight" )//Błąd - nie można pobierać stylów złożonych$ ("p" ) . c s s ("font" )//Ale można je ustawiać$ ("h1" ) . c s s ("font" , "bold italic large serif" )

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 178 / 228

Page 179: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Getery i setery jQuery IV

Metoda val() pozwala ustawiać i odczytywać atrybut valueelementów formularzy HTML.

$ ("#nazwisko" ) . v a l ( )$ ("#mail" ) . v a l ("Niepoprawny mail" )//Reset pól tekstowych do wartości domyślnych$ ("input:text" ) . v a l ( funct ion ( ) {return th i s . d e f a u l t V a l u e ;

})

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 179 / 228

Page 180: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Getery i setery jQuery V

Metody text() i html() pozwalają odczytać (lub ustawić) zawartośćelementu w postaci czystego tekstu lub HTML.

$"head title" ) . t e x t ( )$ ("p" ) . html ( )$ ("h1" ) . t e x t ( funct ion ( n , c u r r e n t ) {return "Paragraf " + ( n+1) + " " + c u r r e n t

}

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 180 / 228

Page 181: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wstawianie i zastępowanie elementów z wykorzystaniemjQuery I

Metoda append() umożliwia dodanie zawartości na końcuokreślonego elementem.

Metoda prepen() umożliwia dodanie zawartości na początkuokreślonego elementem.

Metoda after() pozwala na dodanie zawartości za określonymelementem.

Metoda before() pozwala na dodanie zawartości przed określonymelementem.

Metoda replaceWith() pozwala na zastąpienie celu za pomocąwyspecyfikowanej zawartości.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 181 / 228

Page 182: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Wstawianie i zastępowanie elementów z wykorzystaniemjQuery II

$ ("#article" ) . append ("<br /> Opublikowane:" +n i c k ) ;

$ ("p" ) . b e f o r e ("<hr />" ) ;$ ("p" ) . a f t e r ("<hr />" ) ;$ ("h1" ) . prepend ("Rozdział " ) ;$ ("hr" ) . r e p l a c e W i t h ("<br />" ) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 182 / 228

Page 183: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Ajax z wykorzystaniem jQuery I

Biblioteka jQuery wprowadza szereg udogodnień do obsługi Ajax.

Metoda load() - pobiera URL i asynchronicznie ładuje zawartośćtego URL do wybranego elementu (zastępując starą zawartość nową).

s e t I n t e r v a l ( funct ion ( ) {$ ("#status" ) . l o a d ("stats.html" ) ;} , 60000) ;

Opcjonalnymi argumentami metody load są parametry dodatkowe dlawymaganego URL (są do niego dodawane) oraz funkcja wywołaniazwrotnego (callback) wywołana w momencie zakończenia żądania(pozwala poznać status żądania).

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 183 / 228

Page 184: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Ajax z wykorzystaniem jQuery II

Funkcja jQuery.getScript() pozwala na pobranie i wykonaniekodu JavaScript w globalnym zasięgu.

Funkcja jQuery.getJSON() umożliwia pobranie tekstu iprzetworzenie go przed wywołaniem specjalnej funkcji wywołaniazwrotnego.

Funkcje jQuery.get() i jQuery.post() pobierają zawartośćokreślonego URL-a i przekazują wynik do wyspecyfikowanej funkcjiwywołania zwrotnego. Funkcja get() używa żądania GET a funkcjapost() używa żądania POST.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 184 / 228

Page 185: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Ajax z wykorzystaniem jQuery III

Najbardziej elastyczną funkcją jest jQuery.ajax().

Funkcja ta pozwala na przekazywanie obiektu z określonymiatrybutami, które specyfikują dokładnie żądanie.

jQuery . a j a x ({t y p e : "POST" ,u r l : u r l ,data : nu l l ,dataType : "json" ,t i m e o u t : 5000

}) ;

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 185 / 228

Page 186: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

jQuery UI

Elementy wprowadzane przez jQuery stanowią ramę dla wielupluginów.

Jednym z nich jest jQuery Ui.

Biblioteka ta wprowadza szereg kontrolek interfejsu użytkownikamiędzy innymi pola tekstowe z uzupełnianiem informacji, kontrolkęumożliwiającą wybór daty, paski postępu.

Plugin jQuery UI implementuje także ogólne interakcje pozwalającena przeciąganie, zmianę rozmiaru, wybór i sortowanie dowolnegoelementu dokumentu.

Dodaje także efekty wizualne - ukrywanie, przejścia kolorów itp.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 186 / 228

Page 187: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Literatura

1 D.Flanagan ”JavaScript: The Definitive Guide” wydanie szóste,O’Reilly Media 2011

2 https://developer.mozilla.org/en-US/docs/Web/API

3 http://try.jquery.com

4 http://jqueryui.com/

5 http://es6-features.org

6 https://github.com/lukehoban/es6features

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 187 / 228

Page 188: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Funkcje jako obiekty I

Funkcje Pythona są obiektami.

Mogą być przypisywane do innych zmiennych, przekazywane doinnych funkcji, osadzane w strukturach danych, zwracane z funkcji.

def kwadrat ( x ) :return x ∗ x

def s z e s c i a n ( x ) :return x ∗ x ∗ x

fun = kwadratfun ( 1 2 )l s t = [ ( kwadrat , 12) , ( s z e s c i a n , 10) ]f o r ( f , x ) i n l s t :p r i n t f ( x )

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 188 / 228

Page 189: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Funkcje jako obiekty II

def make ( fun ) :def wywola j ( x ) :return fun ( x )

return wywola j

f 1 = wywola j ( kwadrat )f 1 ( 1 2 )f 2 = wywola j ( s z e s c i a n )f 2 ( 1 0 )

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 189 / 228

Page 190: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Funkcje jako obiekty III

Funkcje posiadają własne atrybuty takie jak na przykład nazwa,dokumentacja domknięcie itp.

def f u n c ( x ) :"""Funkcja podnosząca x do potęgi drugiej"""return x ∗ x

p r i n t ( f u n c . n a m e )p r i n t ( f u n c . d o c )p r i n t ( f u n c . c l o s u r e )p r i n t ( d i r ( f u n c ) )

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 190 / 228

Page 191: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Funkcje jako obiekty IV

Moduł doctest wyszukuje tekst, który wygląda jak interaktywnasesja Pythona a następnie wykonuje ten kod w celu zweryfikowania,że działa on dokładnie tak jak pokazano.Jest kilka sposobów użycia doctest:

Do sprawdzenia, że docstringi modułu są nadal zgodne z tym coprzykłady pokazują.Do wykonywania testów regresyjnych, które weryfikują czyinteraktywne przykłady działają zgodnie ze spodziewanym.Do zapisu samouczka dla modułu, które pokazują jak on działa(wykonywalna dokumentacja).

Do działania wymaga trybu gadatliwego (-v).

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 191 / 228

Page 192: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Funkcje jako obiekty V

def dodawanie ( x , y ) :"""Dodaje do siebie x i y>>> dodawanie(0, 4)4>>> dodawanie(5, 4)9>>> dodawanie(5, -5)0"""return x + y

i f n a m e == "__main__" :import d o c t e s td o c t e s t . testmod ( )

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 192 / 228

Page 193: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Funkcje jako obiekty VI

$ python testy.py

$ python testy.py -vTrying:

dodawanie(0, 4)Expecting:

4okTrying:

dodawanie(5, 4)Expecting:

9ok

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 193 / 228

Page 194: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Funkcje jako obiekty VII

Trying:dodawanie(5, -5)

Expecting:0

ok1 items had no tests:

__main__1 items passed all tests:

3 tests in __main__.dodawanie3 tests in 2 items.3 passed and 0 failed.Test passed.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 194 / 228

Page 195: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Funkcje jako obiekty VIII

Podobnie jak zwykłe obiekty, funkcje mogą posiadać dodatkoweatrybuty:

def f u n k c j a ( ) :pass

f u n k c j a . poziom = 1f u n k c j a . z a b e z p i e c z o n a = True

Atrybuty funkcji są z reguły używane w wyspecjalizowanychdziedzinach zastosowań takich jak generatory parserów i szkieletyaplikacji, gdzie dostarczają dodatkowych informacji o obiekcie funkcji.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 195 / 228

Page 196: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Funkcje jako obiekty IX

Jest też możliwe stworzenie obiektu, który się będzie wywoływał jakfunkcja.

Do tego celu należy utworzyć w klasie metodę __call__

c l a s s P r z y k l a d :def c a l l ( s e l f ) :p r i n t ("Testowe wywołanie obiektu jako

funkcji" )

o b j = P r z y k l a d ( )o b j ( )

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 196 / 228

Page 197: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Operator lambda I

Funkcje anonimowe w Pythonie tworzy się z wykorzystaniemwyrażenia lambda.

Składnia wyrażenia lambda jest następująca:

lambda argumenty: wyrazenie

gdzie argumenty są listą zmiennych rozdzielonych przecinkami, zaśwyrażenie oznacza wyrażenie, które może korzystać z tych zmiennych.

Wynikiem obliczenia wyrażenia lambda jest obiekt funkcyjny, którymoże być przypisany do zmiennej

( lambda x : x ∗∗2) ( 1 2 )fun = lambda x : x ∗∗2fun ( 1 2 )

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 197 / 228

Page 198: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Operator lambda II

Wyrażenia lambda w Pythonie są dość ograniczone nie można w nichkorzystać z niektórych instrukcji (np. pętli) - dozwolone są jedyniewyrażenia.

#Niepoprawne funkcje anonimowelambda x : f o r i i n x : p r i n t ( i )lambda x : i f x>0: 1 e l s e −1#I jedna poprawnalambda x : 1 i f x>0 e l s e −1

Innymi słowy wyrażenia lambda są jak funkcje z pojedynczą instrukcjąpowrotu (return).

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 198 / 228

Page 199: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Operator lambda III

Wyrażenia lambda są użyteczne w sytuacji, gdy przekazywana funkcjaogranicza się do prostego obliczenia wyrażanie, nie jest wtedypotrzebne tworzenie pełnej definicji funkcji.

def w y w o l a j F u n k c j e ( f , x ) :return f ( x )

w y w o l a j F u n k c j e ( lambda x : x ∗∗2 , 12)#inaczej koniecznedef kwadrat ( x ) :return x∗∗2

w y w o l a j F u n k c j e ( kwadrat , 12)

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 199 / 228

Page 200: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Operator lambda IV

Są również użyteczne, gdy użycie instrukcji (np. definicji funkcji)byłoby niepoprawne składniowo:

l s t = [ lambda x : x , lambda x : x ∗∗ 2 ,lambda x : x ∗∗ 3 ]

p r i n t l s t [ 1 ] ( 1 2 )

Definicja literału listowego zakłada użycie wyrażeń a nie instrukcji -definicja funkcji jest, więc w tym przypadku niedozwolona i konicznejest użycie wyrażeń lambda.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 200 / 228

Page 201: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Operator lambda VWyrażenia lambda można zagnieżdżać - można wewnątrz definicjiwyrażenia lambda użyć innego wyrażenia lambda.

W zagnieżdżonych wyrażeniach można wykorzystywać argumentyprzekazywane do wyrażenia (wyrażeń zewnętrznych) - zagnieżdżonyzasięg funkcyjny.

( lambda x : ( lambda y : x + y ) ) ( 1 2 ) ( 4 )#to samo codef utworzDodaj ( x ) :def fun ( y ) :return x + y

return funutworzDodaj ( 1 2 ) ( 4 )

Trzeba jednak zachować ostrożność - takie zagnieżdżone konstrukcjebardzo zaciemniają kod.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 201 / 228

Page 202: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Narzędzia programowania funkcyjnego I

Funkcja map pozwala na wywołanie określonej funkcji dla wszystkichelementów listy, krotki, słownika.

Przyjmuje funkcję i listę (listy) (ogólnie coś co pozwala naprzechodzenie po swoich elementach), zwraca listę.

#[1, 4, 9, 16]map( lambda x : x ∗∗ 2 , [ 1 , 2 , 3 , 4 ] )#[0, 3, 4, 3, 0]# range(5) -> [0, 1, 2, 3, 4]# range(4,-1,-1) -> [4, 3, 2, 1, 0]map( o p e r a t o r . mul , range ( 5 ) , range (4 ,−1 ,−1) )

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 202 / 228

Page 203: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Narzędzia programowania funkcyjnego II

Funkcja filter pozwala na odfiltrowanie z listy tylko tychelementów, dla których predykat (funkcja zwracająca wartośćlogiczną) zwraca wartość prawdy.

Funkcja przyjmuje predykat i listę, zwraca listę.

#Tylko elementy parzyste#[0, 2, 4, 6, 8]f i l t e r ( lambda x : x%2 == 0 , range ( 1 0 ) )

Zamiast wyrażenia lambda mógłby być przekazywany obiektfunkcyjny.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 203 / 228

Page 204: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Narzędzia programowania funkcyjnego III

Funkcja reduce() - wywołuje dwuargumentową funkcję łącząckolejne elementy listy od lewej do prawej, powoduje to zredukowanielisty do pojedynczej wartości.

Przyjmuje funkcję, listę oraz opcjonalną wartość początkową.

#Oblicza wartość#((((1+2)+3)+4)+5)reduce ( lambda x , y : x+y , [ 1 , 2 , 3 , 4 , 5 ] )#reduce(operator.add, [1, 2, 3, 4, 5])

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 204 / 228

Page 205: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Narzędzia programowania funkcyjnego IV

Funkcja zip() - zwraca listę krotek, w której każda i-ta krotkazawiera i-te elementy z sekwencji przekazywanych jako argumenty.

Jeżeli są przekazywane listy o różnej długości to długość wyniku jestobcinana do najkrótszego argumentu.

Z pojedynczym argumentem zwraca listę jednoelementowych krotek.

x = [ 1 , 2 , 3 , 4 ]y = [ 5 , 6 , 7 , 8 ]#[(1, 5), (2, 6), (3, 7), (4, 8)]z ip ( x , y )#[(1,), (2,), (3,), (4,)]z ip ( x )#[(1, 5, 1), (2, 6, 2), (3, 7, 3), (4, 8, 4)]z ip ( x , y , range ( 1 , 1 0 0 ) )

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 205 / 228

Page 206: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Narzędzia programowania funkcyjnego V

Funkcja partial z modułu functools umożliwia częściową aplikacjęfunkcji, tworzy specjlany obiekt, który jest pośrednikiem do wywołaniafunkcji.

Pozwala na ustalenie kilku argumentów funkcji w nowym obiekcie zuproszczoną sygnaturą.

basetwo = p a r t i a l ( int , base =2)#nie 11 111 lecz 31basetwo (’11111’ )#alternatywniedef basetwo ( a rg ) :return i n t ( arg , 2 )

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 206 / 228

Page 207: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Dekoratory I

Dekorator to funkcja, której głównym zadaniem jest przeźroczysteopakowanie innej funkcji lub klasy.

Podstawowym celem tego zabiegu jest zmiana lub rozszerzeniezachowania opakowywanego obiektu.

Dekoratory są lukrem syntaktycznym na wywołanie funkcjipobierającej funkcję.

Dekoratory są oznaczane symbolem @.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 207 / 228

Page 208: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Dekoratory II

@ p r z y k l a ddef fun ( x ) :return x ∗ x ∗ x

#jest równoważne

def fun ( x ) :return x ∗ x ∗ x

fun = p r z y k l a d ( fun )

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 208 / 228

Page 209: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Dekoratory III

#Funkcja pomocnik dodaje elementy do wywołania#funkcji dekorowanej.#Funkcja przyklad zwraca obiekt tej funkcji.#Funkcja dekorowana jest wywołana pośrednio.def p r z y k l a d ( f ) :def pomocnik (∗ args ,∗∗ kwargs ) :p r i n t ("Wywołano " + f . n a m e )return f (∗ args , ∗∗ kwargs )

return pomocnik

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 209 / 228

Page 210: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Dekoratory IV

Dekoratory łatwiej dostrzec niż wywołanie funkcji pomocniczej, któramoże być w kodzie oddalona od modyfikowanej funkcji lub klasy.

Dekoratory są aplikowane raz, gdy jest definiowana klasa lub funkcja,nie ma potrzeby dodawania dodatkowego kodu dla każdego odwołaniado funkcji lub klasy, które mogą się zmienić w przyszłości.

Użytkownik rzadziej zapomina dostosować funkcji lub klasy dowymagań API.

Z drugiej strony dekoratory wprowadzając opakowanie mogą zmieniaćtypy dekorowanych obiektów - może powodować dodatkowe narzutyzwiązane z dodatkowymi wywołaniami.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 210 / 228

Page 211: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Dekoratory V

Pojedynczą funkcję może dekorować wiele dekoratorów.

Ma przy tym znaczenie kolejność dekorowania.

@foo@bar@spamdef f u n k c j a ( a rg ) :return ar g + ar g

#jest to równoważnedef f u n k c j a ( a rg )return ar g + ar g

f u n k c j a = f o o ( bar ( spam ( f u n k c j a ) ) )

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 211 / 228

Page 212: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Dekoratory VI

Dekorator trace, jeżeli jest włączony ślad, zapisuje informacje owywołaniu funkcji w pliku debug.log.

e n a b l e t r a c i n g = Truei f e n a b l e t r a c i n g :

l o g = open ("debug.log" , "w" )

def t r a c e ( f ) :i f e n a b l e t r a c i n g :

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 212 / 228

Page 213: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Dekoratory VII

@ f u n c t o o l s . wraps ( f )def pomocnik (∗ args , ∗∗ kwargs ) :

l o g . w r i t e ("Wywołanie {0} z argumentami {1} i {2}\n". format ( f . name , args , kwargs ) )

wynik = f (∗ args , ∗∗ kwargs )l o g . w r i t e ("Funkcja {0} zwróciła {1}\n"

. format ( f . name , wynik ) )return wynik

return pomocnike l s e :return f

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 213 / 228

Page 214: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Dekoratory VIII

@ t r a c edef fun ( x ) :

return x ∗ x ∗ x

fun ( 1 0 )fun ( 8 )

#Zawartość pliku debug.log#Wywołanie fun z argumentami (10,) i {}#Funkcja fun zwróciła 1000#Wywołanie fun z argumentami (8,) i {}#Funkcja fun zwróciła 512

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 214 / 228

Page 215: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Dekoratory IX

Dekorator memoize pozwala zapamiętać wyniki poprzednich wywołańfunkcji - gdy nastąpi kolejne wywołanie z tymi argumentami funkcjanie będzie wywołana, a wynik zostanie pobrany ze słownika.

def memoize ( o b j ) :cache = o b j . cache = {}

@ f u n c t o o l s . wraps ( o b j )def memoizer (∗ args , ∗∗ kwargs ) :

key = s t r ( a r g s ) + s t r ( kwargs )i f key not in cache :

cache [ key ] = o b j (∗ args , ∗∗ kwargs )return cache [ key ]

return memoizer

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 215 / 228

Page 216: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Generatory I

Generatory są funkcjami, które umożliwiają tworzenie sekwencjiwartości, które mogą być używane do iterowania.

Funkcje tego rodzaju używają słowa kluczowego yield do zwrotukolejnych potrzebnych wartości.

def s e k w e n c j a ( n ) :whi le n < 1 0 :

y i e l d nn += 1

Po wywołaniu funkcji nie jest wykonywany kod, ale tworzony jestspecjalny obiekt generatora.

x = s e k w e n c j a ( 0 )

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 216 / 228

Page 217: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Generatory II

Obiekt generatora jest wywołuje funkcję aż do słowa yield, gdywywoływana jest metoda next() (__next__() w Python 3).

Przy każdym kolejnym wywołaniu program jest wznawiany odpierwszej instrukcji po yield.

x . next ( ) # 0x . next ( ) # 1 itd aż do 10

Najczęściej obiekt generatora jest wykorzystywany w pętlach:

f o r i i n s e k w e n c j a ( 1 0 ) :p r i n t i ∗ i

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 217 / 228

Page 218: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Generatory III

Sekwencja może być potencjalnie nieskończona:

def s e k w e n c j a ( n ) :whi le t r u e :

y i e l d nn += 1

x = s e k w e n c j a ( 0 )#0x . next ( ) #x.__next__() w Python 3#1x . next ( )

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 218 / 228

Page 219: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Generatory IV

Generatory umożliwiają funkcjom uniknięcie wykonywania całej pracyod razu, jest to szczególnie istotne, gdy tworzone listy są duże lub gdyprzy tworzeniu listy dla każdego elementu jest wykonywane dużoobliczeń.

Dodatkowo generatory stanowią prostszą alternatywę do ręcznegozapisywania stanu pomiędzy kolejnymi iteracjami - w generatorachzmienne osiągalne w zasięgu funkcji są zapisywane i przywracaneautomatycznie.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 219 / 228

Page 220: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Generatory V

def fibNum ( n ) :currNum = 1prevNum = 1y i e l d 1i f n == 1 :

returny i e l d 1i = 2whi le i < n :

prevNum , currNum = currNum , currNum +prevNum

y i e l d currNumi += 1

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 220 / 228

Page 221: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Generatory VI

x = fibNum ( 3 )# 1next ( x )# 1next ( x )# 2next ( x )#Traceback (most recent call last):# File "<pyshell#54>", line 1, in <module># next(x)#StopIterationnext ( x )[ i f o r i i n fibNum ( 1 0 0 ) ]

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 221 / 228

Page 222: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Korutyny I

Instrukcja yield może być również wywoływana po prawej stronieoperatora przypisania.

Funkcja, która używa yield w ten sposób jest nazywana korutyną(ang. coroutine).

Do tak przygotowanej funkcji wysyła się kolejne wartości przy pomocymetody send().

Należy przy tym pamiętać o wcześniejszym wywołaniu metodynext() - sterowanie przejdzie do pierwszej instrukcji yield.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 222 / 228

Page 223: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Korutyny II

def o d b i o r c a ( ) :p r i n t "Gotów do odbioru:"whi le ( True ) :

e lem = ( y i e l d )p r i n t elem

/ / . . .o = o d b i o r c a ( )o . next ( )o . send ( 0 )o . send ( 1 2 )o . send ("Atom" )

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 223 / 228

Page 224: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Korutyny III

Korutyna zazwyczaj może być uruchamiana bez końca, chyba żezostanie jawnie zamknięta lub kończy się.

Do zamknięcia strumienia wartości wejściowych służy metodaclose():

o . c l o s e ( )#Traceback (most recent call last):# File "<stdin>", line 1, in <module>#StopIterationo . send ( 4 3 )

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 224 / 228

Page 225: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Korutyny IV

Korutyny mogą jednocześnie przyjmować i zwracać wartości, wsytuacji gdy wartość jest dostarczana w wyrażeniu yield.

def potega ( ) :p r i n t "Gotów"wynik = 0whi le ( True ) :

e lem = ( y i e l d wynik )wynik = 2 ∗∗ elem

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 225 / 228

Page 226: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Korutyny V

o = o d b i o r c a ( )#Gotów#0o . next ( )#4096o . send ( 1 2 )#1024o . send ( 1 0 )

Wywołanie metody next() spowoduje przejście do wyrażenia yield,które zwróci 0 (wartość początkowa zmiennej wynik).

Wartość jaka jest zwracana przy kolejnych wywołaniach send()pochodzi z następnego wyrażenia yield.

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 226 / 228

Page 227: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Korutyny VI

Z koniecznością wywołania metody next() można poradzić sobietworząc odpowiedni dekorator.

def c o r u t i n e ( fun ) :def s t a r t (∗ args , ∗∗ kwargs ) :

g = fun (∗ args , ∗∗ kwargs )g . next ( )return g

return s t a r t

Dekorator automatycznie wykona niezbędne do prawidłowegodziałania korutyny wywołanie metody next().

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 227 / 228

Page 228: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Korutyny VII

@ c o r u t i n edef o d b i o r c a ( ) :p r i n t "Gotów do odbioru:"whi le ( True ) :

e lem = ( y i e l d )p r i n t elem

o = o d b i o r c a#Nie zakończy się błędemo . send (1212)

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 228 / 228

Page 229: Języki interpretowane - IITiSicis.pcz.pl/~agrosser/js2.pdf · Język powstał w połowie lat 90 dwudziestego wieku. Twórcą pierwszej wersji języka jest Rasmus Lerdorf. Jest językiem

Literatura

1 M. Lutz ”Learning Python” wydanie piąte, O’Reilly Media 20132 https://www.python.org/doc/

dr inż. Andrzej Grosser Języki interpretowane Rok akademicki 2015/16 229 / 228