Převod řetězce na číslo

V předchozím příspěvku, jsem ukazoval, že funkce parseInt() je hodně pomalá. Tam šlo ale o zaokrouhlení čísla. Evidentně ale spousta programátorů má pocit, že parseInt() je nevhodná i pro to, pro co je původně určena – tedy získání čísla z řetězce.

var int = parseInt('75 cm', 10); //get number 75

Poznámka: Proč uvádět u parseInt() číselnou soustavu? Protože bez ní se funkce přepne do automatického režimu a pokusí se soustavu odhadnout. A často může dojít k chybě – např. pokud budete parsovat výstup databáze nastavené na ZERO_FILL, snadno vám z ‚01000000‘ vznikne 262144, protože čísla začínající nulou jsou v osmičkové soustavě. Pokud tedy nemáte 110% jistotu, že váš kód poběží pouze v prohlížečích, které splňují ECMAScript 5 (který autodetekci zakazuje), musíte funkci zdůraznit, že skutečně chcete počítat v desítkové soustavě!

Existují ale i další způsoby, které jsou zdánlivě rychlejší (v některých prohlížečích).

Například pro svoji jednoduchost oblíbené kladné znaménko

var
    str = '75',
    int = +str;

Tohle funguje pěkně pro čísla a je o několik desítek procent rychlejší (oproti parseInt) v Internet Exploreru, ale narazíte v okamžiku, kdy se za číslem objeví jednotky, protože pak získáte NaN.

Další oblíbený postup je vynásobení jedničkou:

var
    str = '75',
    int = str * 1;

Jde ale o zcela stejný případ jako u použití znaménka plus – rychlejší (pouze) v IE, ale narazí u jednotek.

Další způsob, který vypadá hodně objektově, a proto je často používán u rádoby velkých projektů:

var
    int1 = new Number('75'),
    int2 = Number('75');

Zde je tolik problémů, že ani nevím, kde začít. Zaprvé vytvoření objektu je mnohem pomalejší než volání funkce (a jelikož Number() stejně musí řetězec nějak rozparsovat, tak dělá to samé co parseInt()). Zadruhé selže u jednotek (Number(’75 cm‘) === NaN) a zatřetí pokud použijete operátor NEW, výsledkem bude objekt místo čísla a tak např. selže operátor typeof (vrátí object místo number) a při následném výpočtu bude potřeba zavolat Number.valueOf(), což znamená další zdržení, nebo pokud NEW nepoužijete, bude sice výsledkem prosté číslo, ale porušujete zásady OOP, když voláte konstruktor bez NEW a zneužíváte vlastnost Javascriptu, že konstruktor je obyčejná funkce a lze tedy zavolat, a schopnost konstruktoru vrátit něco jiného než THIS.

Shrnutí

Používejte metody na to, na co jsou určeny a nesnažte se vymýšlet rádoby chytrá řešení, o kterých si jen myslíte, že by mohly být lepší – tedy pokud to nemáte podložené performance testem.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..