Óvakodjon a típuskényszertől: ez a fejlett funkció apró hibákat okozhat, ezért győződjön meg róla, hogy tudja, hogyan működik.
A JavaScript dinamikus gépelése azt jelenti, hogy a kód egy kicsit egyszerűbb lehet, de még mindig előfordulhat hibák. Ezek elkerülése érdekében hasznos tudni, hogy a JavaScript hogyan oldja fel a különböző típusú értékeket, és összehasonlíthatja azokat.
A JavaScript típuskonverziójának és kényszerítésének megértése elengedhetetlen a megbízható és hatékony programok írásához. Mindegyik koncepciónak sajátos használati esetei és bevált gyakorlatai vannak, amelyek befolyásolhatják a kód viselkedését.
Miért történik a típuskonverzió és a kényszer a JavaScriptben?
A JavaScript nyelv dinamikusan van beírva. Ez azt jelenti, hogy a statikusan beírt nyelvekkel ellentétben a JavaScript nem igényli a változó adattípusának explicit meghatározását a használat előtt. Ehelyett a JavaScript futás közben határozza meg a típust a változó értékétől függően.
Mivel az adattípusok nem kerülnek kifejezetten deklarálásra futásidőig, amikor különböző adatokat igénylő műveleteket hajt végre típusok esetén a JavaScript automatikusan ellenőrzi azok kompatibilitását a végrehajtani kívánt művelethez. Ha kompatibilisek egymással, a művelet normálisan megy végbe.
Tegyük fel azonban, hogy nem kompatibilisek a művelettel – például egy karakterlánc és egy szám hozzáadásával. Ilyen esetekben a JavaScript automatikusan „kényszeríti” az egyik típust, hogy illeszkedjen a másikhoz, hogy biztosítsa a művelet sikerességét ahelyett, hogy hibát dobna ki. Ezt a folyamatot típuskényszernek vagy implicit kényszernek nevezik.
Típus Kényszer
A típuskényszer egy érték automatikus konvertálása egyik adattípusról a másikra, amelyet a JavaScript hajt végre a program futása során, hogy biztosítsa a művelet sikeres végrehajtását.
De nem minden adattípust lehet kikényszeríteni. A karakterlánc, a szám és a logikai érték az egyetlen JavaScript adattípusok hogy a nyelv egy másik típusba fog kényszerülni. Ha nem kompatibilis műveletet próbál végrehajtani olyan adattípusokkal, amelyeket a JavaScript nem tud kikényszeríteni, az hibát fog kiütni.
A JavaScript kikényszeríti a típusokat a művelet típusa és a műveletben használt operátor alapján.
Kényszer a „+” kezelővel
A JavaScriptben a „+” operátor két különböző viselkedést mutat az operandusok típusától függően. Számszerű összeadást és karakterlánc-összefűzést is képes végrehajtani. Ez típuskényszerhez vezethet, ha az egyik operandus nem a várt típusú.
Ha mindkét operandus szám, akkor a „+” operátor kiegészítést hajt végre:
hagyja szám1 = 42;
hagyja szám2 = 10;
hagyja összeg = szám1 + szám2; // Kiegészítés
konzol.log (összeg); // 52
Ha mindkét operandus karakterlánc, a „+” operátor karakterlánc-összefűzést hajt végre:
hagyja str1 = "Helló";
hagyja str2 = "világ";
hagyja eredmény = str1 + " " + str2; // Karakterlánc összefűzése
konzol.log (eredmény); // "Helló Világ"
Ha azonban az operandusok egyike nem karakterlánc, a JavaScript implicit módon karakterláncsá kényszeríti az összefűzés végrehajtása előtt:
// Szám és karakterlánc
hagyja szám = 42;
hagyja str = "Helló";// A szám karakterláncra kényszerítve, majd összefűzve
hagyja eredmény_1 = szám + str;
konzol.log (eredmény_1); // "42 Hello"// Karakterlánc és Boolean
hagyja bool = igaz;
// A bool karakterláncra kényszerítve, majd összefűzve
hagyja eredmény_2 = bool + str;
konzol.log (eredmény_2); // "trueHello"
Kényszer a „-” kezelővel
A JavaScriptben a „-” operátort elsősorban kivonási műveletekre használjuk. Amikor az egyik vagy mindkét operandus egy műveletben, amely magában foglalja a "-” operátor nem szám, a JavaScript megpróbálja számmá kényszeríteni.
Ha mindkét operandus szám, a JavaScript kivonást hajt végre. Akkor is végrehajtja a kivonást, ha az egyik vagy mindkét operandus egy számot reprezentáló karakterlánc:
const szám1 = 10;
const szám2 = 20;
const eredmény_1 = szám2 - szám1; // Kivonás
konzol.log (eredmény_1); // 10
const strNum = "10";
const strNum2 = "20";
const eredmény = strNum2 - strNum; // Írja be a kényszert a számokhoz, majd a kivonást
konzol.log (eredmény_1); // 10
Ha egyik operandus sem szám vagy számot reprezentáló karakterlánc, a JavaScript megpróbálja az adattípust a numerikus megfelelőjére kényszeríteni. Ha az adattípusnak nincs numerikus megfelelője, a művelet visszatér NaN (nem szám):
// Az igaz 1-re, a hamis 0-ra lesz kényszerítve
const boolNum = igaz;
const boolNum2 = hamis;
const eredmény_1 = boolNum - boolNum2;
konzol.log (eredmény_1); // 1// Az üres tömbök 0-ra lesznek kényszerítve
const arrNum = [];
const arrNum2 = [];
const eredmény_2 = arrNum - arrNum2;
konzol.log (eredmény_2); // 0
// az üres objektumok NaN-re kényszerülnek
const objNum = {};
const eredmény_3 = arrNum - objNum;
konzol.log (eredmény_3); // 0 - NaN = NaN
Ebben a példában a JavaScript logikai értékeket kényszerít ki igaz és hamis számszerű egyenértékükre, 1 és 0, illetőleg. Az üres tömbök kényszerítve vannak 0, és az üres tárgyakat arra kényszerítik NaN.
Kényszer az egyenlőség (==)/() operátorokkal
A JavaScriptben az egyenlőség operátorok (== és ) hasonlítsa össze az egyenlőség értékeit. A típuskényszer miatt azonban másként viselkednek.
A "==” (laza egyenlőség) operátor típuskényszert hajt végre, ami azt jelenti, hogy megpróbálja az operandusokat azonos típusúra konvertálni az összehasonlítás előtt:
"10" == 10; // igaz
Ebben a példában a JavaScript a „10” karakterláncot 10-re kényszeríti, így a kifejezés kiértékelése igaz.
Azonban a "” (szigorú egyenlőség) operátor nem hajt végre típuskényszert. Ahhoz, hogy az összehasonlítás visszatérjen, az értéknek és a típusnak meg kell egyeznie igaz:
"10"10; // hamis
Ebben a példában az összehasonlítás tér vissza hamis mert az operandusok különböző típusúak (karakterlánc és szám).
Általában érdemes használni a (szigorú egyenlőség) operátort a JavaScriptben, hogy elkerülje a váratlan típusú kényszer viselkedést.
A típuskényszer vagy az implicit konverzió automatikus jellege miatt váratlan viselkedéshez vezethet. Azokban az esetekben, amikor típusokat kell konvertálni, célszerű a típusokat kifejezetten konvertálni. A típusok kifejezett átalakításának folyamatát típuskonverziónak nevezik. Típusöntésnek és explicit típuskonverziónak is nevezik.
Típus Konverzió
A típuskonverzió, más néven típusöntvény, az a kifejezett folyamat, amelynek során értéket konvertálnak egyik adattípusból a másikba JavaScriptben olyan beépített függvények segítségével, mint pl. Szám(), Húr(), Boolean(), parseInt(), és parseFloat().
A típuskonverziót úgy hajthatja végre, hogy a konvertálni kívánt értéket argumentumként átadja a beépített konverziós függvényeknek. Ezek a függvények ezután átalakítják az értéket a kívánt típusra.
Íme egy példa a Szám() funkció:
const számStr = "123";
const szám = Szám(számStr); // Egy karakterláncot számmá alakít
konzol.log (szám); // 123
Érvényes számnak számító karakterlánc átadása argumentumként a Szám() függvény egy számot ad vissza. Ha érvénytelen számot adunk át, akkor a rendszer visszatér NaN.
Íme egy példa a Húr() funkció:
const bool = igaz;
const str2 = Húr(bool); // Logikai értéket karakterláncsá alakít
konzol.log (str2); // "igaz"
Bármilyen adattípus átadása a szimbólumnak, kivéve a szimbólumot Húr() függvény karakterláncsá alakítja az adattípust.
Íme egy példa a Boolean() funkció:
// Karakterlánc átalakítása logikai értékké (truthy: true, falsy: false)
const str = "Helló";
const bool2 = Boolean(str);
konzol.log (bool2); // igaz
Az igaz értékek átadása a Boolean() függvény a logikai „true” értéket adja vissza, míg a falsy értékek átadása a „false” logikai értéket adja vissza.
Íme egy példa a ParseInt() és ParseFloat() funkció:
// Karakterlánc konvertálása egész számmá
const számStr = "123.00";
const szám1 = parseInt(számStr);
konzol.log (szám1); // 123
// Karakterlánc konvertálása lebegőpontos számmá
const floatStr = "3.14";
const szám2 = parseFloat(floatStr);
konzol.log (szám2); // 3.14
A parseInt() függvény elemzi a string argumentumot, és egy egész számot ad vissza. A parseFloat() függvény a karakterláncot lebegőpontos számmá alakítja.
A típuskényszer és az átalakítás kihasználása
A típuskényszer és a konverzió megértésével megalapozott döntéseket hozhat arról, hogy mikor és hogyan használja ezeket hatékonyan a kódjában. Fontos megtalálni a megfelelő egyensúlyt, megfontoltan alkalmazva a típuskényszert a tömör és kényelmes kód érdekében, és az explicit típuskonverzióra támaszkodva a szándékos és kiszámítható típuskonverziókhoz.