cs: Úvod do JavaScriptu: znovu a konečně správně

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:

  1. false, 0, prázdný řetězec (""), NaN, null, a undefined – všechny se převedou na false
  2. 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.

Tags: . This entry was posted on Sunday, January 18th, 2009 at 8:26 pm and is filed under JavaScript. You can follow any responses to this entry through the RSS 2.0 feed. You can skip to the end and leave a response. Pinging is currently not allowed.

Leave a Reply

Sidebar decoration image
Copyright © 2001-2009 Virtage Software. Virtage is registered trademark of Libor Jelinek.
Developer blogs and tutorials Virtage Developer is proudly powered by WordPress.