Určitě všichni znáte Watmana. Pokud si nepamatujete, určitě jste aspoň slyšeli o lightning talk Wat. A jestli ne, určitě se nejprve podívejte. Osobně mi to přijde zábavné, ale nikdy mě to nějak netrápilo (snad krom sčítání polí), protože kdo by v JavaScriptu chtěl sčítat pole s objektem nebo dva objekty? Nenapadá mě žádný rozumný příklad, kde toho využít.
Nedávno jsem na Twitteru narazil na podobnou srandičku:
alert("1"+"1"); 11 alert("1"-"1"); 0 Whatever you think of JavaScript crypto libraries, at least the language is pretty good at randomness.
— Martijn Grooten (@martijn_grooten) June 17, 2014
Ano, může to vést k chybám, ale rozhodně to nemá nic společného s náhodou. Vysvětlení jak z videa, tak k tomuto, můžete najít na Stackoverflow tady. JavaScript se snaží nejprve přetypovat proměnné do podoby, kterou pravděpodobně potřebujeme. Vše je logicky odůvodnitelné.
Ono se dá takovéto chování pochopit, přihlédne-li se k tomu, pro co byl JavaScript stvořen – pro web. A na webu se komunikuje s uživatelem v řetězcích. Pokud vstupem je číslo, datum či cokoliv jiného, nikoliv text, musíme si to ohlídat sami. To samé se děje na backendu, kde musíme řešit stejnou věc – z requestu také dostaneme jen řetězce a kontrolu a převod do správných typů si musíme ošetřit. Teď už jen záleží, co je každému z nás bližší – zda je lepší nechat aplikaci spadnout či nějakými pravidly zkusit odhadnout, co dělat, a pokračovat.
Ať tak či onak, v obou případech si musíme nějak pomoct a nedoufat na automatiku daného jazyka. Osobně si myslím, že na klientské straně je toto chování asi i lepší. Při chybě je možnost, že aplikace poběží bez problémů dál (nebo taky může spadnou o kousek dál a pak je sranda najít, kde chyba vznikla).
Každopádně jsem ve stejný den narazil ještě na jeden tweet:
JavaScript: A Great Place to Work (via @konklone) pic.twitter.com/UkAZVveAjR
— Jeff Atwood (@codinghorror) June 11, 2014
To mě docela překvapilo. Vysvětlení dává zase smysl. Tady ale už srandičky končí.
JavaScript se mi líbí, ale některé jeho nástrahy jsou zákeřné. Nejen ty výše
zmíněné, další za zmínění stojí třeba porovnání polí ([1,2,3] == [1,2,3] //
false
), či že null
je object
(typeof null // "object"
)… Z toho důvodu
rád používám CoffeeScript s Closure Library. Některé zákeřnosti si tak
odfiltruji, ale přitom se nijak nevzdávám žádných vlastností jazyka. A vám
doporučuji udělat to samé. Ne nutně to samé, co používám já, ani co opěvuje
někdo jiný. Sáhněte po něčem, co vám sedne. Možností je dost: CoffeeScript,
TypeScript, Dart, Closure Library, … (pozor – jQuery zde není
řešením) Důležité je něco si
vybrat a používat.