A JavaScriptben az értékek különböző típusúak lehetnek. Egy változó típusát explicit típuskonverzióval változtathatod meg. Ezen kívül a JavaScript automatikus típuskonverziót (implicit típuskonverziót) is végez, amikor a kontextus megkívánja.
A JavaScriptnek, sok más nyelvvel ellentétben, nincs olyan szerkezete, amellyel egy értéket (más) típusba alakíthatnál, helyette viszont néhány beépített segédeszközt használhatsz.
Leginkább a globális Boolean, Number és String objektumok használhatók függvényként, hogy egy értéket a megfelelő típusra alakítsanak.
A Boolean(value) segítségével bármely értéket Boolean értékké alakíthatsz.
Hogyan is működik ez?
Létezik egy rögzített értékhalmaz, az úgynevezett falsy értékek, amelyek false-ra értékelődnek.
A legfontosabbak: a false, a 0, az üres string, a null, az undefined és a NaN mind falsy.
A teljes listát az MDN „Falsy” című cikke mutatja.
Minden más értékre a Boolean true-t ad vissza.
Ezeket nevezzük truthy értékeknek.
Boolean(-1);
// => true
Boolean(0);
// => false
Boolean(' ');
// => true
Boolean('');
// => false
Figyeld meg, hogy a leírt szabályok miatt a '0', a 'false', a [] és a {} truthy érték a JavaScriptben.
A Number(value) segítségével egy értéket számmá alakíthatsz.
A string elején és végén lévő whitespace karaktereket figyelmen kívül hagyja, az üres stringet pedig 0-vá alakítja.
Ha nem primitív értéket vagy olyan stringet próbálsz átalakítani, amely nem számot reprezentál, nem fog hibát dobni.
Ehelyett az eredmény NaN (Not-A-Number) lesz.
Number(' -12.34 ');
// => -12.34
Number('1,2');
// => NaN
Number('1 2');
// => NaN
Number('');
// => 0
Number('10e3');
// => 10000
Number({ key: '123' });
// => NaN
Alább láthatod, mit ad vissza a Number más primitív értékekre.
Number(true);
// => 1
Number(false);
// => 0
Number(null);
// => 0
Number(undefined);
// => NaN
Vedd észre, hogy az utolsó példával ellentétben a Number() argumentum nélkül hívva definíció szerint 0-t ad vissza.
A JavaScript emellett a parseInt és a parseFloat függvényt is kínálja.
Ezek lazább szabályokat alkalmaznak arra nézve, hogy mely stringek alakíthatók számmá.
Ezért a váratlan eredmények elkerülésére inkább a Number függvényt érdemes használni konverzióra.
parseInt('123a45');
// => 123
Number('123a45');
// => NaN
A String(value) segítségével egy értéket stringgé alakíthatsz.
Primitív értékeknél az eredmény az lesz, amire számítasz.
String(12.34);
// => '12.34'
String(false);
// => 'false'
String(null);
// => 'null'
String(undefined);
// => 'undefined'
Tömböknél a String függvény minden elemre elvégzi a stringgé alakítást, majd az eredményeket vesszővel fűzi össze.
A join metódust magad is meghívhatod, például hogy testre szabd az elválasztót.
Ezekben az esetekben azonban a null és az undefined üres stringgé alakul.
String([42, null, true, 'abc']);
// => '42,,true,abc'
Objektumoknál a String alapértelmezés szerint egy nem túl hasznos szöveget ad vissza.
String({ key: 'value' });
// => '[object Object]'
A konverzió viselkedését testre szabhatod, például egy toString metódus megadásával.
A javascript.info „Objektum primitív értékké alakítása” szakasza részletesen elmagyarázza.
Egy másik gyakori módja annak, hogy az objektumok és tömbök szebb string reprezentációt kapjanak, a JSON-kódolás használata.
A JSON.stringify segítségével stringgé alakíthatsz, a JSON.parse-szal pedig vissza objektummá vagy tömbbé.
const obj = {
name: 'Gilda Guerra',
address: {
city: 'Goiânia',
},
};
JSON.stringify(obj);
// => '{"name":"Gilda Guerra","address":{"city":"Goiânia"}}'
Bizonyos kontextusokban a JavaScript automatikusan átalakít egy értéket egy másik adattípusra, mielőtt kiértékelne egy utasítást. Ezt az implicit átalakítást nevezzük automatikus típuskonverziónak.
Amikor egy érték Boolean-kontextusba kerül, a JavaScript ugyanazokat a szabályokat alkalmazza, mint a Boolean függvény, hogy implicit módon átalakítsa az értéket.
Ha egy elágazás feltétele nem Boolean, akkor automatikus típuskonverzió dönti el, hogy a feltétel teljesül-e vagy sem.
Ugyanez érvényes a ternáris operátor ? első operandusára.
const num = 0;
if (num) {
// this block is NOT executed because 0 is falsy
}
const name = 'Jin';
name ? 'name was provided' : 'no name provided';
// => 'name was provided'
A logikai NOT operátor ! operandusa is Boolean értékké alakul, mielőtt a tagadás megtörténik.
const name = '';
!name;
// => true
A leírt viselkedés következménye, hogy a !!value ugyanolyan hatású, mint a Boolean(value).
Az olvashatóság kedvéért mégis a Boolean használata javasolt.
A JavaScript a logikai AND (&&) és OR (||) operátorok operandusaira is alkalmaz konverziót.
Tartsd azonban észben, hogy a kifejezés eredménye nem feltétlenül Boolean.
A kifejezés az eredeti operandusok egyikét adja vissza (lásd az MDN-t a logikai operátorokról).
null || 'hello';
// => 'hello'
Ha az összeadás + operátorát primitív értékekre használod, és az egyik operandus string, akkor a másik is stringgé alakul.
A konverzió logikája ugyanaz, mint a String függvény használatakor.
Ezután a két string összefűződik.
let name;
'hello ' + name;
// => 'hello undefined'
Ugyanez az implicit konverzió történik a template stringekbe ágyazott nem string értékekkel is.
const degrees = 23;
`It is ${degrees} °C`;
// => 'Is is 23 °C.';
Sok operátor számmá alakítja az operandusokat (ha szükséges), a fentebb bemutatott Number függvény logikája szerint.
+ (ha nincs benne string), -, *, /, %, **
+, -
>, >=, <, <=
|, &, ^, ~
Ha bármelyik operátorról többet szeretnél tudni, nézd meg az MDN operátorlistáját.
Ha egy operandusról elképzelhető, hogy string, a hibák elkerülésére a legjobb mindig explicit módon a Number függvénnyel átalakítani.
'1' + '2';
// => '12'
// addition operator in string context as explained above
Number('1') + Number('2');
// => 3
Néha találkozhatsz azzal, hogy az egyoperandusú plusz operátort string számmá alakítására használják.
Ez nem ajánlott, mert sokkal nehezebben olvasható, mint az explicit Number hívás.
const value = '42';
+value;
// => 42
Number(value);
// => 42
A laza egyenlőség- és egyenlőtlenség-operátorok (==/!=) használata is gyakran jár implicit számmá alakítással.
Ezeknek az operátoroknak a pontos logikája azonban meglehetősen bonyolult (lásd az MDN-t a laza egyenlőségről).
Az eredmények nehezen jelezhetők előre, és néha nem azt kapod, amire számítasz.
Az ilyen implicit konverziók elkerülésére inkább a szigorú egyenlőség/egyenlőtlenség operátorokat (===/!==) használd.