Proč další úvod do JavaScriptu? Třeba protože je to jednoznačně nejnepochopenější programovací jazyk na světě. Často vysmívaný jako hračka, ale za jeho zdánlivou jednoduchostí se skrývají některé skutečně důmyslné a silné vlastnosti. V roce 2005 vznikla řada sofistikovaných JavaScriptových aplikací, které dokázali, že hlubší znalosti této technologie je důležitá pro každého webového vyvojáře.
Pro začátek je užitečné si připomenout historii jazyka. JavaScript byl vytvořen v roce 1995 inženýrem Netscapu Brendanem Eichem, poprvé byl uveden v Netscape 2 na začátku 1996. Původně se měl jmenovat LiveScript, ale byl nesmyslně přejmenován na JavaScript kvůli marketingovému rozhodnutí využít popularity Javy firmy Sun Microsystems – ač mají oba jazyky pramálo společného. Už tohle je zdrojem neporozumění.
Microsoft o několik měsíců později uvedl svůj klon pojmenovaný JScript spolu s IE 3. Netscape předal jazyk evropské standarizační orgranizaci Ecma International, která vydapa první verzi ECMAScriptu v roce 1997. V roce 1999 byla uvolněná významně rozšířená verze ECMAScript 3. vydání, která je dodnes nejpoužívanější vůbec. Současné době se pracuje na 4. vydání.
Taková “dlouhověkost” jedné verze je skvělá pro vývojáře. Já se zaměřím téměř výrahně právě na 3. vydání jazyka ECMAScript. Budu se však držet populárnějšího jména JavaScript.
Narozdíl od většiny programovacích jazyků nemá JavaScript koncept vstupu a výstupu. Je navržet jako čistě skriptovací jazyk “žijící” v prostředí hostitelské aplikace a je právě na hostiteli, aby poskytl mechanizmus pro komunikování s okolím. Nejrozšířenějším hostitelem je webový prohlížeš, ale interpreti JavaScriptu najdeme i v Adobe Acrobatu, Photoshopu, Yahoo!’s Widget engine atd.
Přehled
Začneme pohledem na stavební bloky jakéhokoli jazyka: datové typy. JavaScript pracuje s hodnotami a ty jsou nějakého typu. V JavaScriptu to jsou tyto datové typy:
… a dva zvláštní typy Undefined and Null. Pole, které jsou ale speciálním druhem objektů. Datumy a Regulární výrazy jsou také objekty. A, když chceme být přesní, tak funkce jsou také jen typ objektů. Takže seznam typů ještě jednou a přesněji:
- Číslo
- Řetězec
- Boolean
- Object
- Funkce
- Pole
- Datum
- RegExp (regulární výraz)
- Null
- Undefined
A pak jsou tu pár zabudovaných typu jako Error. Ale nekomplikujme si to a zůstaňme u prvního seznamu.
Čísla
Čísla jsou v JavaScriptu dle specifikace “double-precision 64-bit format IEEE 754 hodnoty”. To má několik zajímavých důsledků. Není zde nic jako integer (celé číslo), proto se mějte na pozoru v aritmetice naučené z C nebo Javy:
0.1 + 0.2 = 0.30000000000000004 (!!!)
Máte k dispozici klasické číselné operátory jako přičítání, odčítání, modulus (zbytek po dělení) apod. Také existuje zabudovaný objekt Math, který nabízí složitější matematické funkce (cos, sin, apod.) a konstanty (číslo PI apod.):
Math.sin(3.5); d = Math.PI * r * r;
Řetězec můežte převést na číslo zabudovanou funkcí parseInt(). První argument je převáděný řetězec, druhý volitelný je základ číselné soustavy (desítková – 10, osmičková 8, apod.), který se v rámci dobrých zvyků doporučuje vždy specifikovat.
> parseInt("123", 10)
123
> parseInt("010", 10)
10
Když nedodáte základ, můžete se dočkat hodně zajímavých výsledků:
> parseInt("010")
8
Zde parseInt() rozhodl, že řetězec obsahuje číslo v osmičkové soustavě, protože začíná na nulu.
Rovněž převod na binární (2) číslo je prostý:
> parseInt("11", 2)
3
Pro nečíselný vstup je vrácena speciální hodnota NaN (“Not a Number”, není číslo):
> parseInt("hello", 10)
NaN
NaN je “nakažlivé”: když NaN vystuouje v jakékoli matematické operaci, celý výsledek je rovněž NaN:
> NaN + 5 NaN
Jestli, je hodnota NaN můžete zabudouvanou funkcí isNaN():
> isNaN(NaN) true
JavaScript také má speciální hodnoty Infinity (nekonečno) and -Infinity (-nekonečno):
> 1 / 0 Infinity > -1 / 0 -Infinity
Řetězce
Řetězec je sekvence znaků. Přesněji Unicode znaků čili každý znak je reprezentován 16 bitovým číslem, což je skvělá zpráva pro všechny, kdo se musí zabývat internacionalizací (i18n).
K uložení jednoho znaku je třeba řetězec o délce 1. Délka řetězce je uložena ve vlastnosti length:
> “hello”.length
5
A teď jsme se poprvé “dotkli” JavaScript objektů! Zmínil jsem se, že řetězce jsou také objekty? Proto mají také methods:
> “hello”.charAt(0)
h
> “hello, world”.replace(“hello”, “goodbye”)
goodbye, world
> “hello”.toUpperCase()
HELLO
Další typy
JavaScript rozlišuje mezi typem null, což je objekt typu ”object’ znamenající, že žádnou hodnotu (non-value), a typem undefined, což je objekt typu ‘undefined’ znamenající neinicializovanou hodnotu — tj., hodnotu, která ještě nebyla přiřazena (určena) proměnné. O proměnných budu mluvit později, ale v JavaScriptu je možné deklarovat proměnnou i bez přiřazení hodnoty. Pokud tak učiníte, proměná bude právě typu undefined.
Dalším typem JavaScriptu je boolean, jehož hodnoty jsou true (pravda) a false (nepravda) (obojí jsou klíčová slova). Jakákoli hodnota může být převedena na boolean podle následujících pravidel:
-
false,0, prázdný řetězec (""),NaN,null, aundefined– všechny se převedou nafalse - všechny ostatní hodnoty na
true
Převod lze provést explicitně pomocí funkce Boolean():
> Boolean("")
false
> Boolean(234)
true
However, this is rarely necessary, as JavaScript will silently perform this conversion when it expects a boolean, such as in an if statement (see below). For this reason, we sometimes speak simply of “true values” and “false values,” meaning values that become true and false, respectively, when converted to booleans. Alternatively, such values can be called “truthy” and “falsy,” respectively.
Boolean operations such as && (logical and), || (logical or), and ! (logical not) are supported; see below.
Variables
New variables in JavaScript are declared using the var keyword:
var a; var name = "simon";
If you declare a variable without assigning any value to it, its type is undefined.
Operators
JavaScript’s numeric operators are +, -, *, / and % – which is the remainder operator. Values are assigned using =, and there are also compound assignment statements such as += and -=. These extend out to x = x operator y.
x += 5 x = x + 5
You can use ++ and -- to increment and decrement respectively. These can be used as prefix or postfix operators.
The + operator also does string concatenation:
> "hello" + " world" hello world
If you add a string to a number (or other value) everything is converted in to a string first. This might catch you out:
> "3" + 4 + 5 345 > 3 + 4 + "5" 75
Adding an empty string to something is a useful way of converting it.
Comparisons in JavaScript can be made using <, >, <= and >=. These work for both strings and numbers. Equality is a little less straightforward. The double-equals operator performs type coercion if you give it different types, with sometimes interesting results:
> "dog" == "dog" true > 1 == true true
To avoid type coercion, use the triple-equals operator:
> 1 === true false > true === true true
There are also != and !== operators.
JavaScript also has bitwise operations. If you want to use them, they’re there.
