ugrás a tartalomhoz

JavaScript alapok: Sztringből egész szám

Jano · 2006. Okt. 2. (H), 06.14
A választások estéjén az Indexen követtem az eseményeket, mikor egyszer csak felzúgott a laptopom hűtője. Ez azt jelzi, hogy valami elkezdte dolgoztatni a processzort. Körbenéztem és a fejléc alatt futó szövegre kezdtem gyanakodni. Gyorsan bele is néztem a kódba. Az első sornál - ahol egésszé akartak konvertálni egy sztringet - azonban elakadtam.

Ez volt az (bár lehet jobb lenne ha nem is írnám le a rossz példát):

function toint( s ) { return s.substring( 0, s.length - 2 ); }
Ez az aprócska függvény azzal a céllal készülhetett, hogy a beadott - mértékegységet is tartalmazó - sztring értékből, csináljon valódi egész számot. Pl. "100px"-ra adjon vissza 100-at. A függvény azonban nem egészen ezt csinálja. Egyszerűen visszaadja a beadott sztring utolsó két karakter nélküli részét. Tehát a viszaadott érték típusa továbbra is string lesz. Ez azonban a kisebbik baj. A JavaScript nyelv nem típusos, és általában értelemszerűen tudja kezelni az ilyen helyzeteket. Másik probléma lehet, hogyha véletlenül egy olyan érték kerül bele, ahol a mértékegység csak egy karakteres pl: 100%.

Hogy mégis miért érdemelt blogbejegyzést? Több okból is. A JavaScriptben van egy beépített parseInt() nevű függvény, ami pontosan azt csinálja, mint amire itt szükség van.

var szam = parseInt(szovegesValtozo)
A parseInt() a paraméterként beadott szöveges változónak megfelelő egészt adja vissza. Szépen működik arra az esetre is, ha a számok után esetleg betűk állnának pl. mértékegység.

var hosszSzoveg = "100px";
var hosszSzam = parseInt(hosszSzoveg);
alert("Típus: " + typeof hosszSzam + " érték:" +hosszSzam);
És hogy miért lassítja a görgőszöveg a böngészőt? Mert minden 25 ezredmásodpercben meg van hívva a függvény. Vagyis minden másodpercben 40-szer kéne lefutnia. De így szép folyamatos lesz majd az animáció - szólhatna a válasz. Csakhogy minden gyerek tudja, hogy moziban is csak 24 képkocka jelenik meg másodpercenként, mégis folyamatosnak látjuk a mozgást. Sőt, ennél kevesebb is elég lehet.
 
1

hmm

Anonymous · 2006. Okt. 2. (H), 07.45
Nem lehet, hogy a substringnél a parseInt még lassabb? Nem ismerem a parseInt függvény működési elvét, de gondolom, hogy azt nézi, hogy meddig van egymás után folyamatosan szám és hol van az első nem szám és ott levágja az elejét. A substring esetenként ennél gyorsabb is lehet szerintem. De mindez csak feltételezés, egyáltalán nem biztos, hogy így van, mindezek mellett a parseInt használata szerintem is jobb, több okból is. Sőt van parseFloat is.
2

így okés?

toxin · 2006. Okt. 2. (H), 09.05

var s = '100px'
console.time('substring');
for (var i=1;i<=100000;i++)
{
    var v = s.substring( 0, s.length - 2 );
    v = s;
}
console.timeEnd('substring');

console.time('parseInt');
for (var i=1;i<=100000;i++)
{
    var v = parseInt(s);
    v = s;
}
console.timeEnd('parseInt');
eredmény :

substring: 3235ms
parseInt: 1110ms

sponsored by FireBug :)

üdv t
4

hoppá

toxin · 2006. Okt. 2. (H), 12.33
Firefox Portable 2.0 Release Candidate 1 -en mérve, viszont

substring: 1484ms
parseInt: 1140ms

valami folyik a háttérben fx-éknél :) , a fenti mérés Firefox Portable 1.5.0.7 -en történt

üdv t
5

csak épp hátrafele

Marcell · 2006. Okt. 2. (H), 13.11
Ja, a parseInt meg lassabb lett :)
8

De...

Bártházi András · 2006. Okt. 3. (K), 10.15
Eléggé megtévesztő a mérésed, ugyanis azt feltételezi, hogy Internet Explorerben ugyanaz a JS motor van. Hát nem. Ebbe a hibába én is beleestem, szuper mérési eredmények, szuper sebesség, aztán IE-ben pedig minden a feje tetejére állt. Ettől függetlenül én is azt valószínűsítem, hogy a parseInt böngészőfüggetlenül gyorsabb, de ezt ki is kéne mérni.
10

Eltörpülő költség

Jano · 2006. Okt. 3. (K), 11.03
Igazából teljesen lényegtelen a feladat szempontjából, hogy azt a szerencsétlen számot hány tized mp alatt adja vissza. A kirajzolás több nagyságrenddel nagyobb feladat.

Lehet hiba volt belekeverni a postba a körülményeket. Csak be akartam mutatni a parseInt függvényt, hogy ilyen is van.

Indexnek egyébként nagyon szép kódja van.
12

na jó

toxin · 2006. Okt. 3. (K), 14.11
de alapmérési ereményeket ismerjük (opera rulz)
http://celtickane.com/projects/jsspeed.php
http://www.howtocreate.co.uk/browserSpeed.html

stb.

most csak a két függvény érdekelt, IE meg ugye alapból nem :) , mondjuk IE7 határozztan gyorsul(t) http://blog.qooxdoo.org/dramatically-improved-ie7-javascript-performance ) , ez örmteli lévén a scriptaculous animációi már szépek benne vs IE6 :))

üdv t

zárójelben jegyzem meg, hogy a http://blogsearch.google.com/ sokkal jobb fejlesztési infokerésre mint a sima gugli , ha vki (?) nem ezt használná még
3

jóhiszeműség

Anonymous · 2006. Okt. 2. (H), 09.57
Nem lehet, hogy a substringnél a parseInt még lassabb?


Nem feltételezel kicsit sokat az index.hu-ról? :)
7

halihó

Anonymous · 2006. Okt. 2. (H), 15.28
Azért nem volt ok nélküli a reggeli felvetésem, mert látom le is mértétek, ezek szerint a parseInt fgv-t jól írták meg és gyorsabb, ez megnyugtató :) Gondoltam, hogy így van, csak felvetettem, hogy hátha...gyakran vannak meglepik
:D

Ő, nem feltételezek az index.hu-ról semmit. Amúgy a nagyobb portálok általában nem rendelkeznek túl szép kóddal, tisztelet a kivételnek. De ez is csak szubjektív véleményem.

nah minden jót.

j.
9

Index.hu

Bártházi András · 2006. Okt. 3. (K), 10.16
Szerintem elég jól feljöttek, ami az oldal kódját és minőségét illeti. Azt meg nem tudjuk, hogy mennyi idő alatt kellett ezt a megoldást összedobniuk... :)
6

egy bosszantó apróság

wiktor · 2006. Okt. 2. (H), 13.14
Fontos megjegyezni azt is, hogy a
var foo = parseInt("08");
és a
var foo = parseInt("09");
esetében is 0-t fogunk kapni. (Talán egyedül Opera alatt nem, de ebben nem vagyok 100%-ig biztos.)

Ez azért van, mert a nullával kezdődő stringeket automatikusan nyolcas számrendszerbeli számnak feltételezi és ott a 08 illetve a 09 érvénytelen.

Ez főleg akkor tud bosszantó lenne, ha dátumokat akarunk kezelni.

A "hiba" elkerülhető, ha az alábbi két megoldás egyikét használjuk:

var foo = parseInt(parseFloat(<szöveg>))
var foo = parseInt(<szöveg>, 10)
További infók: http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256C85006A6604
11

decimális, oktális

Jano · 2006. Okt. 3. (K), 11.06
A függvénynek van egy opcionális paramétere is, amivel megadható, hogy milyen számrendszerbe értelmezze.
parseInt(string[, radix])
Core JavaScript 1.5 Reference:Global Functions:parseInt