2 + 2 néha 22, avagy összeadás JavaScriptben
A Stack Overflown bukkantam a Strangest language feature (röviden: WTF) témára. Érdemes a válaszokat átfutni, számos különc viselkedést vonultatnak fel a válaszadók. Az egyik volt ezek közül a JavaScript (ECMAScript) +
operátorának bizonyára már sokatok által megtapasztalt sajátossága.
'2' + 2; // '22'
'2' - 2; // 0
A JavaScript nem nyújt külön műveletet stringek összefűzésére, így a +
operátor jelenthet string konkatenációt és numerikus értékek összegzését is. Hogy éppen melyik lesz, azt aszerint dönti el, hogy a műveleti jel két oldalán álló összeadandók között van-e string típusú (typeof '2' === 'string'
). Ha van, akkor a number típusú összeadandók stringgé lesznek konvertálva (cast). A helyzet akkor érdekesebb, ha egy kifejezésben több összeadandó is szerepel.
2 + 2 + '2'; // 42;
A +
operátor csak két argumentummal apellál, és a kiértékelés balról jobbra történik. Az első műveletben két számot összegzünk, így annak eredménye is numerikus lesz, az azt követő művelet viszont konkatenálás lesz a string típusú összeadandó miatt.
'2' + 2 + 2; // '222'
A fenti okfejtés illik erre a példára is: az augend string típusú, így az első művelet konkatenáció lesz, aminek string típusú eredményét kapja a második művelet.
A probléma azért életszerű, mert sokszor számok is string típusként érkeznek a függvények bemenetére (XHR válasz, beviteli mező érték sít.).
Jellemzően három bevált gyakorlat áll a rendelkezésre. Talán a leggyakrabban alkalmazott módszer a parseInt()
függvény.
parseInt('123', 10); // 123
parseInt('123a1', 10); // 123
A parseInt()
string típusú értékből integert próbál meg kinyerni. Érdekessége, hogy az első, a megadott számrendszerben nem értelmezett karaktertől levágja a stringet. Csak egész értékek kezeléséhez használható. Párja a parseFloat()
.
Egy másik járható út a Number
objektum függvényként való meghívása, ami az argumentumként kapott string típusú értéket kisérli meg számmá alakítani. Számként nem értelmezhető karakter esetén NaN
-nal tér vissza. Érdekessége, hogy üres string esetén 0-t ad vissza.
Number('-12.5'); // -12.5
Végül talán a legkézenfekvőbb és a Mozilla Developer Center szerzője szerint is javallot út az unáris +
operátor használata.
+'-12.5'; // -12.5;
+'2' + 2; // 4
■Unary plus is the fastest and preferred way of converting something into a number, because it does not perform any other operations on the number. It can convert string representations of integers and floats, as well as the non-string valuestrue
,false
, andnull
. Integers in both decimal and hexadecimal ("0x"-prefixed) formats are supported. Negative numbers are supported (though not for hex). If it cannot parse a particular value, it will evaluate toNaN
.
utolso megoldast nem
Tyrael
Szintén
unary jó
Ugye általában matematikai műveletet végzünk leggyakrabban a számokon, így összekötve a kettőt, egy csapásra átalakította:
var a = '1';
a-1+2 //= 2
Mellékhatások
+
operátort, és mikorparseInt
/parseFloat
-ot. Amennyiben valaki kíváncsi részletesebben a számokra JavaScriptben, annak ajánlott elolvasni a The Complete Javascript Number Reference-tKösz
Felhasználótól jövő adat
exponenciális