JavaScriptové perličky III.

JavaScript je literální jazyk. Slovo literální v tomto případě neodkazuje na literaturu, ale na pojem literál, neboli přímý zápis konstanty daného datového typu. Například toto:

"Řetězec"

je v JavaScriptu literál objektu String.

JavaScript nazývám literální, protože má oproti jiným jazykům literály na spoustu věcí. Samozřejmostí jsou čísla a řetězce (jako skoro v každém programovacím jazyce), o něco méně obvyklý už je literál pole (i když i ten se v některých jazycích vyskytuje):

a = ["a", "b", "c"];
document.write(a[0]); // vypíše "a"

Poměrně kuriózní už ale je literál regulárního výrazu, který je jedním ze základních objektů jazyka. Striktně řečeno je to literál instance třídy RegExp. Malý příklad:

re = /(w+)s(w+)/; // ekvivalent re = new RegExp("(w+)s(w+)");
s1 = "David Majda";
s2 = s1.replace(re, "$2 $1");
document.write(s2); // vypíše "Majda David"

Mimochodem, regulární výrazy v JavaScriptu jsou 100% perlovské.

Nejneobvyklejší typ literálu je ale literál objeků. Přiznám se, že jsem se s něčím takovým ještě nesetkal v žádném jazyce, který jsem se kdy učil a i v JavaScriptu jsem o tom dlouho nevěděl. Vypadá to takhle:

Po staru (bez literálů):

objekt = new Object();
objekt.vlastnost1 = 5;
objekt.vlastnost2 = "skákal pes přes oves";

Po novu (s pomocí literálu):

objekt = {
  vlastnost1: 5,
  vlastnost2: "skákal pes přes oves"
}

Hodí se to třeba v případech, kdy potřebujete předat objekt jako parametr nějaké funkce – s pomocí literálu ho můžete vytvořit přímo při jejím volání:

f({v1: 5, v2: "skákal pes přes oves"});

Možná se ptáte, jak se určí třída daného objektu. Přiznám se, že nevím, jak to udělat. Pokud zápisu s literálem předřadíte objekt = new Trida(), literál deklaraci přepíše (tj. nový objekt bude tříady Object). Pozdější nastavení prototypu nefunguje. No, třeba někdo ze čtenářů zná řešení...

P.S.: Literální je jen moje soukromé označení – výplod mé hravosti, žádná oficiální terminologie. To jen tak pro pořádek.