Egy pár napja túrtam a jQueryUI forráskódját, mert a dialoghoz hasonló dolgot szerettem volna varázsolni, és következő kifejezésre lettem figyelmes a 9377. sorban: ( nem, az egy darab pluszjel nem typo! )
if (+myAt[i] === myAt[i])
egy pár percig néztem WTF fejjel, körbekérdezgettem a kollégákat, hogy láttak-e már ilyet, majd miután mindenkitől nemleges választ kaptam, elkezdtem utána járni a dolognak.
var a = 1,
b = 'alma';
console.log( +a ); // === 1
console.log( +a === a ); //true
console.log( +b ); // NaN
console.log( +b === b ); //false
Tehát a + jellel a változónkat megpróbáljuk számmá parse-olni, és ha ez sikerül akkor meg fog egyezni az eredeti értékével, ha nem sikerül akkor pedig nem fog megegyezni. Miután ezt megtudtam óriási lelkendezésbe kezdtem.
De nem hagyott a gondolat nyugodni, hogy miért így ellenőrzi a jQueryUI, hogy szám-e az adott érték, miért nem használja minderre az isNaN függvényt?!
(Megjegyzés: az isNaN("13") kifejezésre false-zal tér vissza, magyarul számként értelmezi, míg a ' var a = "13"; console.log( +a === a );' szintén false lesz, de itt ez azt jelenti, hogy az "a" változót nem sikerült számmá alakítani)
Ezek után írtam egyszerű tesztet, hogy lássam a jQueryUI vagy az isNaN megoldás a gyorsabb: jsperf.com/a-a-or-isnan
Jelenleg még csak 4 böngészőverzión teszteltem, és eddig tisztán látszik, hogy számoknál a jQueryUI-s megoldás gyorsabb, míg stringnél Chrome 10-ben és FF3.6-ban az isNaN, FF4b10-ben és Opera11-ben a másik megoldás volt a gyorsabb. (Alig várom, hogy Windowson és Macen is kipróbálhassam :) )