Přejít k navigační liště

Zdroják » Zprávičky » Top ten chyb v JavaScriptu

Top ten chyb v JavaScriptu

Nálepky:

JavaScript je mnohými zavrhován, a většinou jsou argumenty proti němu spíš ukázkou neznalosti kritizujícího než opravdových chyb v návrhu. JavaScript obsahuje, samozřejmě jako každý jazyk, množství chyb. Nejlépe je znají ti, kteří daný jazyk opravdu ovládají. Autor článku Top 10 Things that JavaScript Got Wrong je milovníkem JavaScriptu, a v úvodu píše: „… většina výhrad neznalých proti JavaScriptu jsou spíš výhrady proti DOM API“. Mezi deset zásadních chyb řadí např. jméno (JS nemá téměř nic společného s Javou, a mnohé nedorozumění pramení právě z tohoto), fakt že Null je objekt, že NaN není rovno NaN, globální proměnné, nekonzistentní pravidla pro oblast platnosti, příliš velké množství FALSE hodnot, nejednoznačnost některých konstrukcí či neschopnost počítat (zkuste si např. kolik je v JavaScriptu 0.2+0.4)

Komentáře

Subscribe
Upozornit na
guest
19 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
xpckar

Ad 4.
Nikdo globální proměnný používat nemusí. Jsou tu prototypy, „falešný“ jmenný prostory apod.

Srigi

Za dost velky problem JS povazujem to, kde „ukazuje“ this. Nikto o tom nepise a pritom to moze niekedy posobit konfuzne. Viem minimalne o styroch roznych moznostiach:

// #1
function foo() {
  console.log(this); // ukazuje na window
}
foo();


// #2
function Bar() {
  console.log(this); // ukazuje na vytvoreny objekt a
}
var a = new Bar();


// #3
var obj = {
  foo : function() {
    console.log(this); // ukazuje na obj
  }
}
obj.foo();


// #4
var obj = {
  foo : function() {
    function bar() {
      console.log(this); // ukazuje na window
    }
    bar();
  }
}
obj.foo();

Hlavne stvrty pripad je velmi zradny ( this sa neprenasa do vnutornej funkcie) a nikde sa o tom clovek nedocita. Viac o tomto v Crockfordovej prednaske (cca 8 min).

ah01

Nedá mi to a musím si rýpnout.

Druhý bod, tedy že NaN není rovno NaN je ukázkovou neznalostí kritizujícího. Schválně si zkuste porovnat NaN v jiných jazycích, třeba v jave, C# nebo v PHP. NaN je takto definováno v IEEE 754. Ve všech jazycích, které tuto normu používají, včetně JS, prostě NaN takto funguje. Není to žádnou chybou JavaScriptu.

kverulant

Další nesmysl je třeba práce z čísly s plovoucí desetinnou čárkou. Uvedená chyba je taky ve všech běžně používaných jazycích(je to vlastnost reprezentace těchto čísel).
7. je taky úplná blbost. Nechápu proč míchá && mezi bitové operátory.

kverulant

Třeba v pythonu to je způsobené zaokrouhlením výpisu. Interně tam ta chyba pořád je.

>>> print "%1.20fn" % (0.2 + 0.4)
0.60000000000­000008882

Problém je totiž v tom, že double (8 bajtů) dokáže „přesně“ uložit max 15 pozic. Rozdíl je pouze v tom, jak se číslo před výpisem zaokrouhlí.

v2kt0r

Presne tak…ale on se v „Update“ pod tim bodem sam opravil, nasel nekde presne ten argument, ktery mne napadl jako prvni> srovnani NaN s nekonecnem. To se sobe samo take nerovna. Stejne jako dve NaN hodnoty se jeste vzajemne nemuseji rovnat. Toz tak :)

Martin

V tom případě „neumí“ počítat žádný programovaví jazyk neimplementující pevnou desetinnou čárkou? To mi připadá, že se autor chtěl dostat na desatero a nevěděl co dál, když si stěžuje na základní vlastnost floating point aritmetiky…

Pavel

Být nespokojený s globálním kontextem je stejné, jako kdyby programátorovi Javy vadilo, že všechny package začínají od kořenového, tedy toho prázdného. Pokud pak někdo v Javě nepoužívá balíčky, tak je to jeho chyba a ne jazyka.

V JavaScriptu lze jmenné prostory vytvořit velice snadno. Pravda, není to tak přímočaré jako balíčky v „plnotučnějších“ jazycích.

xpckar

Jenomže s tím programátoři již počítají, a podle toho názvy volí. Kromě toho, na případnou kolizi přijdou již při ladění, a můžou se dle toho zařídit.

Pavel

Tak teď jsem to dočetl. Je to opravdu spíše článek pro srandu. Vše co je tam napsané je spíše nepochopení (až na toho nesouvisejícího UserAgenta). Možná tak největší chyba JavaScriptu je, že se tváří být jazykem jednoduchým a nedomyšleným, ale ve skutečnosti je velmi promyšlený a poměrně komplexní.

pas

Taky mě ta aritmetika, NaN či globální proměnné zarazily a zdá se mi, že autor toho článku patří spíše do kategorie nekompetentních kritiků, kterým se zdejší šéfredaktor s oblibou posmívá (kdyby se takovýto soupis objevil v rámci nějaké zdejší diskuse… ;-)).

blizzboz

mne v JS chýbajú triedy, modifikátory prístupu (public, private, protected, internal) u tried, členov tried a properties…, preťažovanie operátorov, properties, namespaces, indexery, design by contract, typová bezpečnosť, generické triedy, lambda výrazy atď proste veci ktoré razantne zvyšujú prehľadnosť, bezpečnosť a modulárnosť.

jasné že vela vecí je možné emulovať, ale to len poukazuje na fakt že JS je chudobný jazyk, a na to aby som vyjadril to isté čo v inom jazyku musím napísať viac kódu.

Chcelo by to niečo ako nadstavbu nad JS nejaký JS++

pas

Návrh „JS++“ už před pár lety vzniknul, pod názvem ECMAScript 4 (viz třeba „http://met.blog­.root.cz/2007/11/­29/ecmascript-4-prichazi/). Bohužel byl odmítnutý pro přílišnou revolučnost, implementoval jej (resp. jeho podstatnou část) pouze Flash, ve víře, aby držel krok s JavaScriptem. Každý flashař si od té doby libuje, že je produktivnější a dělá méně chyb, a možný přechod na HTML5 se mu tím pádem jeví jako krok zpět, kde už byl. V odborných kruzích bývá ale setřen, že nerozumí kráse a nadčasovosti původního JavaScriptu. Takže objevujme tu krásu, i já se snažím, nic jiného nám nezbývá. :)

bauglir

Na ten článek jsem na tutsech v jejich top 150 narazil… Ono stačí si tam přečíst komentáře, aby člověk pochopil, že přes kvalitu serveru, tenhle článek je špatný… roztrhali tam prakticky vše, co píše na kousky…

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.