PÅ™i tvorbÄ› jakékoli aplikace je dobré vyvažovat pÅ™ehlednost zápisu kódu s jeho efektivitou. Protože interprety JavaScriptu bohužel nejsou z nejrychlejÅ¡Ãch, pÅ™icházà velmi Äasto ke slovu právÄ› faktor druhý, na úkor intuitivnosti zápisu. Jako tÅ™eba u následujÃcÃho problému:
Máme barevné složky R, G a B, z nichž každá je vyjádÅ™ena desetinným ÄÃslem v intervalu <0; 1>. Z tÄ›ch potÅ™ebujeme zÃskat Å™etÄ›zec ve tvaru RRGGBB. Složky bude tedy tÅ™eba zvÄ›tÅ¡it do rozsahu 0–255, zaokrouhlit, pÅ™evést na ÄÃsla Å¡estnáctková a jednoznakové výsledky zleva doplnit nulou, aby sestavený Å™etÄ›zec mÄ›l vždy právÄ› Å¡est znaků. Jak ale splnit poslednà požadavek co nejrychleji a bez podmÃnÄ›ného pÅ™idávánà nuly?
Metoda ÄÃslo.toString(16) sice pÅ™evede ÄÃslo do Å¡estnáctkové soustavy, ale k doplnÄ›nà poÄáteÄnà nuly ji pÅ™imÄ›t nelze. Na sprintf() můžeme zapomenout a co se týÄe regulárnÃch výrazů, jejich vyhodnocenà je pomalé. NabÃzà se vkládat nulu vždy a potom z Å™etÄ›zce zprava vytáhnout dva znaky, tedy ('0'+cislo).substr(-2), jenže IE záporný offset nepodporuje.
Nedávno mÄ› trklo zajÃmavé Å™eÅ¡enÃ. K ÄÃslům nejprve pÅ™iÄteme 256, ÄÃmž po pÅ™evodu zÃskáme vždy nejménÄ› 10016 a nejvÃce 1FF16. Pak zbývá jen oÅ™Ãznout poÄáteÄnà jedniÄku. Jak jsem zmÃnil na zaÄátku, pÅ™ehlednost takového algoritmu je na pováženou, ale za tu efektivitu jistÄ› stojÃ:
function rgbToHex(R, G, B) { return ( Math.round(256 + 255*R).toString(16).substr(1) + Math.round(256 + 255*G).toString(16).substr(1) + Math.round(256 + 255*B).toString(16).substr(1) ) }