Představte si, že ošetříte pole ve formuláři na webové stránce pomocí JavaScriptu tak, aby uživatel musel zadat celé číslo větší než nula. Jako příklad si můžeme vzít třeba pole pro zadání měsíce (1–12). Abyste uživateli ušetřili práci, vyhodnotíte vložený údaj pomocí parseInt()
a pokud bude hodnota mimo zadaný interval, nedovolíte formulář odeslat. Jde o jednoduchou funkci, každý ji bez problémů dokáže napsat, při testech vše funguje tak jak má, až při předání zákazníkovi se začnou množit stížnosti na to, že nelze odeslat formulář, i když je všechno vyplněné správně.
Možná příčina je ve funkci parseInt. Schválně, zkuste si tipnout, co v JavaScriptu vypíše následující kód:
function test(x) { document.write("'" + x + "' = "); document.write(parseInt(x)); document.write(" "); } test("01"); test("02"); test("07"); test("08"); test("09");
Možná vás to překvapí (i když by nemělo!), ale výsledek bude vypadat takto:
'01' = 1 '02' = 2 '07' = 7 '08' = 0 '09' = 0
Stačí pak, aby uživatel do pole pro měsíc nezadal „8“, ale „08“, a bude chováním velmi překvapen (navíc když mu zadání „07“ prošlo bez problémů…) Příčina je, jak už jistě tušíte, v tom, že JS parser používá syntaxi čísel z C, kde číslo, které začíná znakem „0“, je zapsáno v osmičkové soustavě.
Jak se vyhnout podobným problémům, a to rovnou několika různými způsoby, ukazuje Thomas Fuchs v článku Adventures in JavaScript number parsing.
Přehled komentářů