Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00838 010923 7461343 na godz. na dobę w sumie
Tajniki języka JavaScript. Typy i składnia - ebook/pdf
Tajniki języka JavaScript. Typy i składnia - ebook/pdf
Autor: Liczba stron: 160
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-283-2185-4 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> webmasterstwo >> javascript - programowanie
Porównaj ceny (książka, ebook (-20%), audiobook).
Nawet początkujący programista może szybko zacząć tworzyć funkcjonalne aplikacje w JavaScripcie. Jest to prosty i łatwy w użyciu język, który cieszy się dużym uznaniem, a jednocześnie stanowi złożoną kolekcję mechanizmów, zapożyczonych z różnych języków programowania (są to np. podstawy proceduralne znane z języka C czy podstawy funkcjonalne w stylu języka Scheme/Lisp). Bez starannej analizy mechanizmy te nie będą zrozumiałe nawet dla najbardziej doświadczonych projektantów. A przecież umiejętność rozwiązywania problemów i tworzenia kodu o naprawdę wysokiej klasie w prosty sposób zależy od takiego właśnie dogłębnego zrozumienia mechanizmów języka, w którym się pisze.

Niniejsza książka jest czwartą częścią serii w całości poświęconej językowi JavaScript. Jest przeznaczona dla osób, które używają JS w pracy i chcą dogłębnie poznać jego składniki. Omówiono w niej rodzaje i zastosowanie typów oraz istotne niuanse składni. Poza ogólnymi informacjami szczegółowo opisano m.in. typy wbudowane, konwersję typów, wartości specjalne, obiekty macierzyste, prototypy macierzyste, instrukcje i wyrażenia, reguły kontekstowe. Co najważniejsze, materiał przedstawiono w sposób przystępny, zwięzły, klarowny i zarazem na bardzo wysokim poziomie.

Dzięki tej książce: Zrozum mechanizmy języka JavaScript i pisz kod dobrej jakości!
Znajdź podobne książki

Darmowy fragment publikacji:

Tytuł oryginału: You Don t Know JS: Types Grammar Tłumaczenie: Piotr Pilch ISBN: 978-83-283-2174-8 © 2016 Helion S.A. Authorized Polish translation of the English edition You Don t Know JS: Types Grammar ISBN 9781491904190 © 2015 Getify Solutions, Inc. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/tjtypy Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis treści Przedmowa ................................................................................................................ 5 Wprowadzenie ............................................................................................................ 7 1. Typy ......................................................................................................................... 11 11 12 14 18 Typ identyfikowany przez dowolną inną nazwę… Typy wbudowane Wartości jako typy Podsumowanie 2. Wartości ................................................................................................................... 19 19 21 23 29 36 40 Tablice Łańcuchy Liczby Wartości specjalne Porównanie wartości z odwołaniem Podsumowanie 3. Obiekty macierzyste .................................................................................................. 43 44 45 46 47 55 Właściwość wewnętrzna [[Class]] Obiekty opakowujące Rozpakowywanie Obiekty macierzyste jako konstruktory Podsumowanie 4. Konwersja typów ...................................................................................................... 57 57 59 68 80 Przekształcanie wartości Operacje abstrakcyjne na wartościach Jawna konwersja typów Niejawna konwersja typów 3 Poleć książkęKup książkę Porównanie równości luźnej i ścisłej Abstrakcyjne porównanie relacyjne Podsumowanie 91 105 107 5. Gramatyka .............................................................................................................. 109 109 121 128 131 133 135 138 140 Instrukcje i wyrażenia Pierwszeństwo operatorów Automatycznie używane średniki Błędy Argumenty funkcji Blok try..finally switch Podsumowanie A Kod JavaScript w środowisku mieszanym ................................................................. 143 143 145 146 146 150 152 153 Załącznik B (język ECMAScript) Obiekty hosta Zmienne globalne modelu DOM Prototypy obiektów macierzystych Elementy script Słowa zastrzeżone Ograniczenia implementacji B Podziękowania ....................................................................................................... 155 Skorowidz ............................................................................................................... 158 4 (cid:95) Spis treści Poleć książkęKup książkę ROZDZIAŁ 1. Typy Większość projektantów stwierdziłaby, że język dynamiczny (np. JavaScript) pozbawiony jest typów. Sprawdźmy, co na ten temat napisano w specyfikacji języka ECMAScript 5.1 (http://www.ecma- -international.org/ecma-262/5.1/): Algorytmy ujęte w tej specyfikacji modyfikują wartości, z których każda ma powiązany typ. Możliwe typy wartości są dokładnie tymi, które zdefiniowano w niniejszej klauzuli. Typy są dodatkowo klasyfikowane jako typy języka ECMAScript i typy specyfikacji. Typ języka ECMAScript odpowiada wartościom, które są bezpośrednio modyfikowane przez programistę używającego tego języka. Do tej kategorii typów zaliczają się typy undefined, null, boolean, string, number i object. Jeśli jesteś zwolennikiem języków z silną (statyczną) typizacją, możesz nie zgodzić się z takim użyciem słowa „typ”. W takich językach termin „typ” oznacza o wiele więcej niż w języku JavaScript. Niektórzy twierdzą, że w obrębie języka JavaScript nie powinno się posługiwać terminem „typy” i że zamiast niego powinno być używane określenie „znaczniki” lub być może „podtypy”. Też coś! Użyjemy następującej ogólnej definicji (jak można sądzić, tej samej, na której bazuje sformu- łowanie zawarte w specyfikacji): typ to nieodłączny, wbudowany zbiór cech, które w unikalny sposób identyfikują zachowanie określonej wartości i odróżniają ją od innych wartości, zarówno z punktu widzenia silnika, jak i projektanta. Inaczej mówiąc, jeśli silnik i projektant traktują wartość 42 (liczba) inaczej niż wartość 42 (łańcuch), to te dwie wartości mają inne typy, czyli odpowiednio typy number i string. Używając wartości 42, zamierzasz wykonać jakieś działanie liczbowe (np. obliczenie matematyczne). Gdy jednak zastosujesz wartość 42 , zamierzasz zrealizować jakieś działanie łańcuchowe (np. wyświetlenie wyniku na stronie itp.). Te dwie wartości mają różne typy. W żadnej mierze nie jest to idealna definicja. Wystarczająca jest jednak na potrzeby niniejszego omówienia, a ponadto jest spójna ze sposobem opisu typów w samym języku JavaScript. Typ identyfikowany przez dowolną inną nazwę… Pomińmy rozbieżności w definicji i zastanówmy się, dlaczego to, czy język JavaScript zawiera typy, czy nie, ma znaczenie. 11 Poleć książkęKup książkę Właściwe interpretowanie każdego typu i jego zachowania jest absolutnie kluczowe, jeśli chcemy wiedzieć, w jaki sposób poprawnie i dokładnie przekształcać wartości w wartości innych typów (zajrzyj do rozdziału 4.). Niemal każdy powstały dotychczas program JavaScript wymaga jakiejś formy obsługi konwersji wartości, dlatego ważne jest, aby przeprowadzać to w odpowiedzialny i pewny sposób. Jeśli istnieje wartość 42 typu number, ale wymagasz potraktowania jej jak wartości typu string (np. w przypadku pobierania wartości 2 jako znaku na pozycji 1), musisz oczywiście dokonać naj- pierw konwersji typu wartości z typu number na typ string. Wydaje się to zupełnie proste. Istnieje jednak wiele różnych sposobów przeprowadzenia takiej konwersji. Niektóre z nich są jawne, proste i pewne. Jeśli jednak nie zachowasz ostrożności, konwersja może przebiegać w bardzo dziwny i zaskakujący sposób. Niejasności związane z konwersją typów to być może jeden z najpoważniejszych problemów, z jakimi zmagają się projektanci używający języka JavaScript. Często była ona krytykowana jako niebez- pieczna i mogąca być traktowana jako błąd w projekcie języka, a tym samym kwalifikująca się do odrzucenia i unikania. Wiedząc, czym są typy języka JavaScript, zamierzamy pokazać, dlaczego zła reputacja konwersji typów jest w dużej mierze wynikiem przesadnego szumu. Dzięki temu zyskasz odpowiednią perspektywę, która umożliwi Ci dostrzeżenie możliwości i przydatności konwersji. Wcześniej jednak musimy znacznie dokładniej przybliżyć wartości i typy. Typy wbudowane W języku JavaScript zdefiniowano następujących siedem typów wbudowanych: (cid:120) null, (cid:120) undefined, (cid:120) boolean, (cid:120) number, (cid:120) string, (cid:120) object, (cid:120) symbol (dodany do języka ECMAScript 6!). Wszystkie powyższe typy z wyjątkiem typu object są nazywane „prymitywnymi”. Operator typeof sprawdza typ danej wartości i zawsze zwraca jedną z siedmiu wartości łańcuchowych. Co zaskakujące, w przypadku wcześniej wyszczególnionych siedmiu typów wbudowanych nie występuje dokładne dopasowanie „jeden do jednego”: 12 (cid:95) Rozdział 1. Typy Poleć książkęKup książkę typeof undefined === undefined ; // true typeof true === boolean ; // true typeof 42 === number ; // true typeof 42 === string ; // true typeof { life: 42 } === object ; // true // dodane w j(cid:266)zyku ECMAScript 6! typeof Symbol() === symbol ; // true Z sześcioma powyższymi typami powiązane są odpowiednie wartości. Jak widać, typy zwracają warto- ści łańcuchowe, które są nazwami tych typów. Symbol to nowy typ danych, który pojawił się w języku ECMAScript 6. Typ ten zostanie omówiony w rozdziale 3. Jak być może zauważyłeś, powyższy listing nie uwzględnia typu null. Jest to typ specjalny w tym sensie, że w połączeniu z operatorem typeof powoduje błędne działanie: typeof null === object ; // true Byłoby miło (i poprawnie!), gdyby w tym przypadku został zwrócony wynik null , ale ten istniejący od początku w języku JavaScript błąd przetrwał przez niemal dwie dekady. Prawdopodobnie nig- dy nie zostanie usunięty, ponieważ istnieje tak duża liczba danych internetowych, które bazują na takim błędnym działaniu, że „naprawienie” błędu spowodowałoby wystąpienie większej liczby „błędów” i awarię większości oprogramowania internetowego. Aby sprawdzić wartość używającą swojego typu pod kątem typu null, musisz skorzystać z warunku złożonego: var a = null; (!a typeof a === object ); // true null to jedyny typ prymitywny, który jest „fałszywy” (inaczej mówiąc, przypominający wartość false; zajrzyj do rozdziału 4.), ale zwracający też object w wyniku sprawdzenia za pomocą operatora typeof. Jaka zatem jest siódma wartość łańcuchowa, którą może zwrócić operator typeof? typeof function a(){ /* .. */ } === function ; // true Łatwo pomyśleć, że słowo function będzie reprezentowało w języku JavaScript typ wbudowany naj- wyższego poziomu, zwłaszcza biorąc pod uwagę takie zachowanie operatora typeof. Jeśli jednak przeczytasz specyfikację, zauważysz, że function to w rzeczywistości swego rodzaju „podtyp” typu object. Dokładniej rzecz ujmując, funkcja jest określana mianem „obiektu wywoływalnego”, czyli obiektu z wewnętrzną właściwością [[Call]], która umożliwia jego wywołanie. To, że funkcje to tak naprawdę obiekty, jest dość przydatne. I co najważniejsze, obiekty te są wy- posażone we właściwości. Oto przykład: function a(b,c) { /* .. */ } Obiekt funkcji ma właściwość length służącą do ustawienia wielu formalnych parametrów, które są deklarowane wraz z nią: a.length; // 2 Typy wbudowane (cid:95) 13 Poleć książkęKup książkę Ponieważ zadeklarowano funkcję z dwoma formalnymi parametrami z nazwą (b i c), „długość funkcji” wynosi 2. A co z tablicami? Są one wbudowane w język JavaScript czy reprezentują specjalny typ? typeof null === object ; // true W żadnym razie. Są to tylko obiekty. Jak najbardziej odpowiednie jest postrzeganie ich też jako „podtypu” typu object (zajrzyj do rozdziału 3.). W tym przypadku tablice cechują się dodatkowo in- deksowaniem liczbowym (w przeciwieństwie do zwykłych obiektów, które bazują na stosowaniu klu- czy w postaci łańcucha) oraz utrzymywaniem automatycznie aktualizowanej właściwości .length. Wartości jako typy W języku JavaScript zmienne są pozbawione typów — to wartości mają typy. W dowolnym mo- mencie zmienne mogą przechowywać dowolną wartość. Inny sposób postrzegania typów języka JavaScript polega na tym, że nie zachodzi w nim „wymuszanie typów”. Oznacza to, że silnik nie wymaga, aby zmienna zawsze przechowywała wartości tego sa- mego typu początkowego, który został użyty na początku. W ramach jednej instrukcji przypisania zmienna może przechowywać typ string, w następnej instrukcji może zawierać typ number itd. Wartość 42 jest macierzystego typu number. Typ ten nie może zostać zmieniony. Inna wartość, taka jak 42 typu string, może zostać utworzona na bazie wartości 42 typu number z wykorzystaniem procesu nazywanego konwersją typów (ang. coercion); zajrzyj do rozdziału 4. Użycie operatora typeof dla zmiennej nie oznacza wbrew temu, co może się wydawać, zadania pytania: „Jaki jest typ zmiennej?”. Wynika to stąd, że zmienne w języku JavaScript nie mają typów. Formułowane jest natomiast następujące pytanie: „Jaki jest typ wartości w zmiennej?”. var a = 42; typeof a; // number a = true; typeof a; // boolean Operator typeof zawsze zwraca łańcuch. A zatem: typeof typeof 42; // string W pierwszym przypadku (typeof 42) operator typeof zwraca number , a w drugim (typeof number ) zwraca string . Porównanie typu undefined z terminem „niezadeklarowane” Zmienne, które w danym momencie nie mają żadnej wartości, w rzeczywistości zawierają wartość typu undefined. Wywołanie operatora typeof dla takich zmiennych spowoduje zwrócenie undefined : var a; typeof a; // undefined var b = 42; var c; 14 (cid:95) Rozdział 1. Typy Poleć książkęKup książkę // w dalszej cz(cid:266)(cid:286)ci kodu b = c; typeof b; // undefined typeof c; // undefined Dla większości projektantów kuszące może być potraktowanie słowa „undefined” (niezdefiniowane) jako synonimu słowa „undeclared” (niezadeklarowane). W języku JavaScript te dwa pojęcia są jednak całkiem odmienne. Zmienna „niezdefiniowana” to zmienna, która została zadeklarowana w dostępnym zasięgu, ale w danym momencie nie przechowuje żadnej wartości. Z kolei zmienna „niezadeklarowana” to zmien- na, która formalnie nie została zadeklarowana w dostępnym zasięgu. Przeanalizuj następujący kod: var a; a; // undefined b; // b(cid:225)(cid:261)d ReferenceError: zmienna b nie zosta(cid:225)a zdefiniowana Irytującą niejasnością jest komunikat o błędzie przypisywany przez przeglądarki powyższemu wa- runkowi. Jak widać, komunikat ma treść: „zmienna b nie została zdefiniowana” („b is not defined”). Oczywiście może on bardzo łatwo i w uzasadniony sposób zostać pomylony z komunikatem: „zmienna b jest typu undefined” („b is undefined”). Powtórzmy — w języku angielskim sformuło- wania „undefined” („typ undefined”) i „is not defined” („nie została zdefiniowana”) mają zupełnie różne znaczenia. Aby zminimalizować niejasności, byłoby miło, gdyby przeglądarki wyświetlały takie anglojęzyczne komunikaty, jak „b is not found” („zmienna b nie została znaleziona”) lub „b is not declared” („zmienna b nie została zadeklarowana”)! Z operatorem typeof powiązane jest też specjalne zachowanie odnoszące się do niezadeklarowanych zmiennych, które wywołuje jeszcze większe niejasności. Przeanalizuj następujący kod: var a; typeof a; // undefined typeof b; // undefined Operator typeof zwraca undefined nawet w przypadku „niezadeklarowanych” (lub „niezdefiniowa- nych”) zmiennych. Zauważ, że po wykonaniu kodu typeof b nie został zgłoszony żaden błąd, na- wet pomimo tego, że zmienna b jest niezadeklarowana. Jest to specjalne zabezpieczenie związane z zachowaniem operatora typeof. Podobnie jak wcześniej, byłoby miło, gdyby operator typeof zastosowany wraz z niezadeklarowaną zmienną spowodował zwrócenie komunikatu ze słowem „undeclared” („niezadeklarowana”), zamiast łączyć wartość wynikową z różnymi wariantami słowa „undefined” („niezdefiniowana” lub „typ undefined”). Wartości jako typy (cid:95) 15 Poleć książkęKup książkę Sprawdzanie pod kątem niezadeklarowanej zmiennej za pomocą operatora typeof Mimo wszystko opisane powyżej zabezpieczenie jest przydatną możliwością przy korzystaniu z kodu JavaScript w przeglądarce, gdy wiele plików skryptowych może ładować zmienne do współ- użytkowanej, globalnej przestrzeni nazw. Wielu projektantów jest przekonanych, że w globalnej przestrzeni nazw nigdy nie powinno być żadnych zmiennych, a ponadto, że wszystko powinno być zawarte w modułach i prywatnych (osobnych przestrzeniach nazw). W teorii brzmi to wspaniale, ale w praktyce jest prawie niemożliwe. Niemniej jednak jest to cel, do którego warto dążyć! Na szczęście w języku ECMA- Script 6 dodano znakomitą obsługę modułów, co ostatecznie zapewni znacznie większą prak- tyczność. W ramach prostego przykładu wyobraź sobie użycie „trybu debugowania” w programie, który jest kontrolowany przez zmienną globalną (flagę) o nazwie DEBUG. Chciałbyś sprawdzić, czy ta zmienna została zadeklarowana przed wykonaniem zadania debugowania, takiego jak rejestrowanie komu- nikatu w konsoli. Deklaracja zmiennej globalnej najwyższego poziomu var DEBUG = true zostałaby dołączona tylko do pliku debug.js, który ładowany jest w przeglądarce wyłącznie w trybie projekto- wania (testowania), lecz nie w środowisku produkcyjnym. Musisz jednak zadbać o to, jak zmienna globalna DEBUG zostanie sprawdzona w reszcie kodu aplikacji, aby nie został zgłoszony błąd ReferenceError. W tym przypadku z pomocą przychodzi zabezpiecze- nie powiązane z operatorem typeof: // Ojej, to spowodowa(cid:225)oby zg(cid:225)oszenie b(cid:225)(cid:266)du! if (DEBUG) { console.log( Debugowanie rozpoczyna si(cid:218) ); } // To jest bezpieczny sposób sprawdzania istnienia zmiennej. if (typeof DEBUG !== undefined ) { console.log( Debugowanie rozpoczyna si(cid:218) ); } Tego rodzaju sprawdzenie przydaje się nawet wtedy, gdy nie masz do czynienia ze zmiennymi zde- finiowanymi przez użytkownika (np. DEBUG). Jeśli sprawdzasz funkcję na potrzeby wbudowanego interfejsu API, możesz również uznać za pomocny wariant sprawdzenia bez zgłaszania błędu: if (typeof atob === undefined ) { atob = function() { /*..*/ }; } Jeśli definiujesz „uzupełniacz” (ang. polyfill) funkcji, która jeszcze nie istnieje, prawdopodobnie chcesz uniknąć użycia słowa kluczowego var do zadeklarowania zmiennej atob. Jeśli zmienną tę deklarujesz wewnątrz instrukcji if za pomocą instrukcji var atob, deklaracja ta jest „wy- noszona” (zajrzyj do książki Tajniki języka JavaScript. Zakresy i domknięcia z tej samej serii) na początek zasięgu nawet wtedy, gdy nie zostanie spełniony warunek instrukcji if (ponie- waż istnieje już zmienna globalna atob!). W niektórych przeglądarkach oraz w przypadku wybranych specjalnych typów wbudowanych zmiennych globalnych (często nazywanych „obiektami hosta”) taka zduplikowana deklaracja może spowodować zgłoszenie błędu. Ominię- cie słowa kluczowego var zapobiega takiej „wynoszonej” deklaracji. 16 (cid:95) Rozdział 1. Typy Poleć książkęKup książkę Innym sposobem wykonywania takich sprawdzeń w odniesieniu do zmiennych globalnych, lecz bez funkcji zabezpieczenia operatora typeof, jest ustalenie, że wszystkie takie zmienne są też wła- ściwościami obiektu globalnego, który w przeglądarce jest zasadniczo obiektem window. A zatem powyższe sprawdzenia mogłyby zostać przeprowadzone (dość bezpiecznie) następująco: if (window.DEBUG) { // .. } if (!window.atob) { // .. } Inaczej, niż jest przy odwoływaniu się do niezadeklarowanych zmiennych — przy próbie uzyskania dostępu do właściwości obiektu (nawet w przypadku obiektu globalnego window), która nie istnieje, nie jest zgłaszany błąd ReferenceError. Z kolei ręczne odwoływanie się do zmiennej globalnej za pomocą odwołania window jest czymś, cze- go niektórzy projektanci wolą unikać, zwłaszcza gdy kod musi być uruchamiany w wielu środowi- skach z kodem JavaScript (nie tylko przeglądarki, ale też na przykład serwerowe środowisko node.js), w których zmienna globalna nie zawsze może mieć nazwę window. Z technicznego punktu widzenia takie zabezpieczenie operatora typeof przydaje się nawet wtedy, gdy nie są używane zmienne globalne, choć takie sytuacje są rzadsze, a część projektantów może uznać taki wariant projektowania za mniej pożądany. Wyobraź sobie funkcję narzędziową, która ma być kopiowana i wklejana przez inne osoby do ich programów lub modułów. W funkcji ma być sprawdzane, czy program dołączający zdefiniował określoną zmienną (aby można było z niej skorzystać): function doSomethingCool() { var helper = (typeof FeatureXYZ !== undefined ) ? FeatureXYZ : function() { /*.. funkcja domy(cid:286)lna ..*/ }; var val = helper(); // .. } Funkcja doSomethingCool() sprawdza zmienną o nazwie FeatureXYZ. Jeśli ją znajdzie, zostanie ona użyta. W przeciwnym razie funkcja zastosuje własną zmienną. Jeśli ktoś dołączy tę funkcję do wła- snego modułu (programu), w bezpieczny sposób sprawdzi ona, czy została zdefiniowana zmienna FeatureXYZ: // wzorzec IIFE (Immediately Invoked Function Expressions; wi(cid:266)cej na temat natychmiast wywo(cid:225)ywanych wyra(cid:298)e(cid:276) funkcji // zamieszczono w odpowiednim podrozdziale ksi(cid:261)(cid:298)ki Scope Closures z tej serii, // w której opisano zasi(cid:266)gi i domkni(cid:266)cia) (function(){ function FeatureXYZ() { /*.. moja funkcja XYZ ..*/ } // do(cid:225)(cid:261)czenie funkcji doSomethingCool(..) function doSomethingCool() { var helper = (typeof FeatureXYZ !== undefined ) ? FeatureXYZ : function() { /*.. funkcja domy(cid:286)lna ..*/ }; Wartości jako typy (cid:95) 17 Poleć książkęKup książkę var val = helper(); // .. } doSomethingCool(); })(); W kodzie zmienna FeatureXYZ wcale nie jest zmienną globalną, ale jednak używane jest zabezpie- czenie operatora typeof w celu zapewnienia bezpiecznego sprawdzenia pod kątem takiej zmien- nej. Co ważne, w tym przypadku nie jest dostępny żaden obiekt, który można by zastosować (jak- by miało to miejsce przy zmiennych globalnych, gdyby zostało użyte odwołanie window.___) do przeprowadzenia sprawdzenia, dlatego operator typeof okazuje się dość pomocny. Część projektantów będzie preferować wzorzec projektowy określany mianem „wstrzykiwania zależności”, w którym zamiast funkcji doSomethingCool() sprawdzającej niejawnie, czy zmienna FeatureXYZ ma zostać zdefiniowana poza jej obrębem, będzie wymagane jawne przekazanie zależ- ności w następujący sposób: function doSomethingCool(FeatureXYZ) { var helper = FeatureXYZ || function() { /*.. funkcja domy(cid:286)lna ..*/ }; var val = helper(); // .. } Przy tworzeniu takiej funkcjonalności dostępnych jest wiele opcji. Żaden wzorzec nie jest tutaj „po- prawny” ani „niepoprawny”. Z każdym wariantem związane są różne kompromisy. Ogólnie jednak miłe jest to, że zabezpieczenie operatora typeof oferuje więcej możliwości. Podsumowanie W języku JavaScript dostępnych jest siedem typów wbudowanych: null, undefined, boolean, number, string, object i symbol. Mogą one być identyfikowane za pomocą operatora typeof. Zmienne nie mają typów, ale zawarte w nich wartości już tak. Typy te definiują natywne zachowanie wartości. Wielu projektantów będzie przyjmować, że terminy „niezdefiniowana” (ang. undefined) i „niezade- klarowana” znaczą mniej więcej to samo. W języku JavaScript są to jednak dość odmienne pojęcia. Wartość typu undefined może być przechowywana przez zadeklarowaną zmienną. Termin „nieza- deklarowana” oznacza zmienną, która nigdy nie została zadeklarowana. Niestety, w języku JavaScript w pewnym stopniu te dwa terminy są łączone, nie tylko w komunika- tach o błędach (np. „Błąd ReferenceError: zmienna b nie została zdefiniowana”), ale też w wartościach zwracanych operatora typeof, który w przypadku obu terminów przekazuje undefined . Zabezpieczenie (zapobiegające błędowi) operatora typeof użyte w odniesieniu do niezadeklaro- wanej zmiennej może być jednak pomocne w niektórych sytuacjach. 18 (cid:95) Rozdział 1. Typy Poleć książkęKup książkę Skorowidz RegExp(..), 50 Symbol(..), 52 konwersja daty na liczbę, 71 łańcuchów na liczby, 69, 81 na wartość typu boolean, 78, 86 typów, 14, 23, 57 wartości boolowskich na liczby, 84 wartości typu symbol, 90 korekcja błędów, 130 L liczby, 19, 23 32-bitowe, 29 całkowite, 27 całkowite ze znakiem, 29 dziesiętne, 26 specjalne, 31 literał null, 152 literały boolowskie, 152 liczbowe, 24 obiektowe, 116 Ł łańcuchy, 19, 21 liczbowe, 75 M metoda slice(), 21 model DOM, 20, 146 A abstrakcyjne porównanie relacyjne, 105 analizowanie łańcuchów liczbowych, 75 wartości, 76 argument zastępujący, 62 argumenty funkcji, 133 automatycznie używane średniki, 128 B blok, 119 try..catch, 141 try..catchable, 140 try..finally, 135 bloki opcjonalne, 120 błąd, 130, 131 ReferenceError, 16, 17 SyntaxError, 132 błędy gramatyczne, 132 składni, 132 wczesne, 140 D destrukturyzacja obiektu, 119 E element script , 150 etykiety, 116 F format JSON, 60, 118 funkcja foo(), 135 gramatyka, 109 G I implementacja, 153 instrukcja, 109 break, 118 if, 115 return, 136 switch, 138 J jawna konwersja typów, 59, 68 jawne przekazanie zależności, 18 język ECMAScript, 143 K klauzula else if, 120 finally, 136, 141 klucze, 20 komunikat o błędzie, 15 konstruktor Array(..), 47 Date(..), 51 Error(..), 51 Function(..), 50 Object(..), 50 158 (cid:95) Skorowidz Poleć książkęKup książkę N narzędzie Array, 21 nawiasy klamrowe, 116 niejawna konwersja typów, 59, 80, 103 wartość zwracana, 111 niejawne upraszczanie, 80 nieskończoność, 33 O obcinanie bitów, 74 obiekt arguments, 21 obiekty fałszywe, 66 hosta, 145 macierzyste, 43 macierzyste jako konstruktory, 47 opakowujące, 45 podobne do tablic, 20 typu string, 22 odwołanie, 36 ograniczenia implementacji, 153 operacja ToBoolean, 65 ToNumber, 63 ToString, 59 operacje abstrakcyjne, 59 operator , 87 ?, 125 ||, 87 ++, 113 ==, 91 ===, 91 delete, 114 równości bezwzględnej, 36 typeof, 14, 16 void, 30 operatory jednoznaczność, 128 łączność, 125 pierwszeństwo, 121 skrócenie, 124 ściślejsze wiązanie, 124 P pętla, 118 pierwszeństwo operatorów, 121 podkładki, 148 porównanie łańcuchów z liczbami, 93 obiektów z wartościami, 97 relacyjne, 105 wartości typu null z wartościami typu undefined, 95 wartości z odwołaniem, 36 z wartością boolowską, 94 prototypy jako wartości domyślne, 54 macierzyste, 53 obiektów macierzystych, 146 przekształcanie w łańcuch, 60 wartości, 57 pułapki, 46, 140 R reguły kontekstowe, 116 rozpakowywanie, 46 równość abstrakcyjna, 92 bezwzględna, 36 luźna, 91 ścisła, 91 S, Ś składnia wartości liczbowych, 24 słowa kluczowe, 152 zastrzeżone, 152 słowo kluczowe var, 16 specjalna równość, 36 specyfikacja Web ECMAScript, 144 sprawdzanie poczytalności, 102 standard IEEE 754, 34 strefa TDZ, 132 T tablice, 19 wielowymiarowe, 19 TDZ, Temporal Dead Zone, 132 testowanie liczb całkowitych, 28 typ, 11 array, 19 boolean, 78 GrammarError, 132 null, 40 number, 19, 23 string, 19 symbol, 90 undefined, 14, 29 typy wbudowane, 12 U uzupełniacz, polyfill, 16, 148 W wartości, 19 domyślne, 54 fałszywe, 65, 99 jako typy, 14 końcowe instrukcji, 110 liczbowe, 24 prawdziwe, 67 specjalne, 29 wartość Infinity, 33 NaN, 31, 36 null, 29, 40 undefined, 29 właściwości, 20 właściwość Number.EPSILON, 27 wewnętrzna [[Class]], 44 wydajność określania równości, 91 wyrażenia, 109 Z zakresy liczb całkowitych, 27 zero, 34 zmienna, 14 globalna DEBUG, 16 undefined, 30 zmienne globalne modelu DOM, 146 znak tyldy, 71 Skorowidz (cid:95) 159 Poleć książkęKup książkę
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Tajniki języka JavaScript. Typy i składnia
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: