Čuvajte se prisiljavanja na tip: ova napredna značajka može biti uzrok suptilnih grešaka, pa se pobrinite da znate kako radi.
Dinamičko tipkanje u JavaScriptu znači da vaš kod može biti malo jednostavniji, ali je još uvijek moguće napraviti pogreške. Da biste ih izbjegli, korisno je znati kako JavaScript razrješava vrijednosti s različitim vrstama, kako biste ih usporedili.
Razumijevanje pretvorbe tipa i prisile u JavaScriptu ključno je za pisanje pouzdanih i učinkovitih programa. Svaki koncept ima specifične slučajeve upotrebe i najbolje prakse koji mogu utjecati na ponašanje vašeg koda.
Zašto dolazi do pretvorbe tipa i prisile u JavaScriptu?
JavaScript jezik se dinamički upisuje. To znači da, za razliku od statički tipiziranih jezika, JavaScript ne zahtijeva da eksplicitno definirate tip podataka varijable prije njezine upotrebe. Umjesto toga, JavaScript određuje vrstu tijekom izvođenja ovisno o vrijednosti varijable.
Budući da tipovi podataka nisu eksplicitno deklarirani do vremena izvođenja, kada izvodite operacije koje zahtijevaju različite podatke vrste, JavaScript automatski provjerava njihovu međusobnu kompatibilnost za operaciju koju želite izvesti. Ako su međusobno kompatibilni, operacija se odvija normalno.
Međutim, pretpostavimo da nisu kompatibilni s operacijom - na primjer, pokušaj zbrajanja niza i broja. U takvim slučajevima, JavaScript automatski "prisiljava" jednu od vrsta da odgovara drugoj kako bi osigurao da je operacija uspješna umjesto da izbacuje pogrešku. Ovaj proces je poznat kao prisila tipa ili implicitna prisila.
Vrsta Prisila
Prisiljivanje tipa je automatska konverzija vrijednosti iz jedne vrste podataka u drugu koju izvodi JavaScript tijekom izvođenja programa kako bi se osiguralo da se operacija uspješno izvrši.
Ali ne mogu se svi tipovi podataka prisiliti. Niz, broj i booleov jedini su JavaScript tipovi podataka da će jezik prisiliti na drugačiji tip. Kada pokušate izvesti nekompatibilnu operaciju s vrstama podataka koje JavaScript ne može prisiliti, javit će se pogreška.
JavaScript prisiljava tipove na temelju vrste operacije i operatora koji koristite u operaciji.
Prisila s operatorom “+”.
U JavaScriptu, "+” Operator ima dva različita ponašanja ovisno o vrsti svojih operanda. Može izvoditi i numeričko zbrajanje i ulančavanje nizova. To može dovesti do prisile tipa kada jedan od operanda nije očekivanog tipa.
Ako su oba operanda brojevi, "+” operator izvodi zbrajanje:
neka num1 = 42;
neka broj2 = 10;
neka zbroj = num1 + num2; // Zbrajanje
konzola.log (zbroj); // 52
Ako su oba operanda nizovi, "+” operator izvodi spajanje nizova:
neka str1 = "Zdravo";
neka str2 = "svijet";
neka rezultat = str1 + " " + str2; // Spajanje nizova
konzola.log (rezultat); // "Pozdrav svijete"
Međutim, ako jedan od operanda nije niz, JavaScript će ga implicitno pretvoriti u niz prije izvođenja ulančavanja:
// Broj i niz
neka broj = 42;
neka str = "Zdravo";// num se prisiljava na niz i zatim ulančava
neka rezultat_1 = broj + str;
konzola.log (rezultat_1); // "42Zdravo"// String i Booleov
neka bool = pravi;
// bool se prisiljava na niz i zatim ulančava
neka rezultat_2 = bool + str;
konzola.log (rezultat_2); // "trueHello"
Prisila s operatorom “-”.
U JavaScriptu, "-” operator se prvenstveno koristi za operacije oduzimanja. Kada jedan ili oba operanda u operaciji koja uključuje "-” operator nije broj, JavaScript će ga pokušati pretvoriti u broj.
Kada su oba operanda brojevi, JavaScript izvodi oduzimanje. Također izvodi oduzimanje kada su jedan ili oba operanda nizovi koji predstavljaju broj:
konst num1 = 10;
konst broj2 = 20;
konst rezultat_1 = broj2 - broj1; // Oduzimanje
konzola.log (rezultat_1); // 10
konst strNum = "10";
konst strNum2 = "20";
konst rezultat = strNum2 - strNum; // Upišite prisilu na brojeve, zatim oduzimanje
konzola.log (rezultat_1); // 10
Kada niti jedan od operanda nije broj ili niz koji predstavlja broj, JavaScript će pokušati prisiliti tip podataka na njegov numerički ekvivalent. Ako vrsta podataka nema numerički ekvivalent, operacija će se vratiti NaN (Nije broj):
// true se prisiljava na 1, false se prisiljava na 0
konst boolNum = pravi;
konst boolNum2 = lažno;
konst rezultat_1 = boolNum - boolNum2;
konzola.log (rezultat_1); // 1// prazni nizovi se prisiljavaju na 0
konst arrNum = [];
konst arrNum2 = [];
konst rezultat_2 = arrNum - arrNum2;
konzola.log (rezultat_2); // 0
// prazni objekti se prisiljavaju na NaN
konst objNum = {};
konst rezultat_3 = arrNum - objNum;
konzola.log (rezultat_3); // 0 - NaN = NaN
U ovom primjeru, JavaScript prisiljava Booleove vrijednosti pravi i lažno njihovim numeričkim ekvivalentnim vrijednostima, 1 i 0, odnosno. Prazni nizovi su prisiljeni na 0, a prazni predmeti su prisiljeni na NaN.
Prisila s operatorima jednakosti (==)/().
U JavaScriptu, operatori jednakosti (== i ) usporedite vrijednosti za jednakost. Međutim, ponašaju se drugačije zbog prisile tipa.
"==” (loose equality) operator izvodi prisilu tipa, što znači da pokušava pretvoriti operande u isti tip prije usporedbe:
"10" == 10; // istina
U ovom primjeru, JavaScript prisiljava niz "10" na broj 10, tako da se izraz procjenjuje na pravi.
Međutim "” (stroga jednakost) operator ne izvodi prisilu tipa. Zahtijeva da vrijednost i tip budu isti da bi se usporedba vratila pravi:
"10"10; // lažno
U ovom primjeru vraća se usporedba lažno jer su operandi različitih tipova (string i broj).
Općenito biste trebali koristiti (stroga jednakost) operator u JavaScriptu kako bi se izbjeglo neočekivano ponašanje prisile tipa.
Prisila na tip ili implicitna konverzija mogu dovesti do neočekivanog ponašanja zbog svoje automatske prirode. U slučajevima kada trebate pretvoriti tipove, preporučljivo je eksplicitno pretvoriti tipove. Proces eksplicitne pretvorbe tipova poznat je kao pretvorba tipa. Također se naziva i pretvaranje tipa i eksplicitna konverzija tipa.
Pretvorba tipa
Pretvorba tipa, također poznata kao pretvaranje tipa, eksplicitan je postupak pretvaranja vrijednosti iz jednog tipa podataka u drugi u JavaScriptu pomoću ugrađenih funkcija kao što su Broj(), Niz(), Boolean(), parseInt(), i parseFloat().
Pretvorbu tipa možete izvršiti prosljeđivanjem vrijednosti koju želite pretvoriti u ugrađene funkcije pretvorbe kao argument. Ove funkcije zatim pretvaraju vašu vrijednost u željenu vrstu.
Evo primjera korištenja Broj() funkcija:
konst numStr = "123";
konst broj = Broj(brojStr); // Pretvara niz u broj
konzola.log (broj); // 123
Prosljeđivanje niza koji je važeći broj kao argumenta za Broj() funkcija će vratiti broj. Vraća se prosljeđivanje niza koji je nevažeći broj NaN.
Evo primjera korištenja Niz() funkcija:
konst bool = pravi;
konst str2 = Niz(bool); // Pretvara booleov u niz
konzola.log (str2); // "istina"
Prosljeđivanje bilo koje vrste podataka u osim simbola u Niz() funkcija će pretvoriti tip podataka u niz.
Evo primjera korištenja Boolean() funkcija:
// Pretvaranje niza u booleov (istinit: istinit, lažan: lažan)
konst str = "zdravo";
konst bool2 = Booleov(str);
konzola.log (bool2); // istina
Prenošenje istinitih vrijednosti na Boolean() funkcija vraća booleov "true" dok prosljeđivanje lažnih vrijednosti vraća booleov "false".
Evo primjera korištenja ParseInt() i ParseFloat() funkcija:
// Pretvaranje niza u cijeli broj
konst numStr = "123.00";
konst num1 = parseInt(brojStr);
konzola.log (broj1); // 123
// Pretvaranje niza u broj s pomičnim zarezom
konst floatStr = "3.14";
konst broj2 = parseFloat(floatStr);
konzola.log (broj2); // 3.14
The parseInt() funkcija analizira argument niza i vraća cijeli broj. The parseFloat() funkcija pretvara niz u broj s pomičnim zarezom.
Iskorištavanje prisile tipa i pretvorbe
Razumijevanjem prisile tipa i pretvorbe, možete donositi informirane odluke o tome kada i kako ih učinkovito iskoristiti u svom kodu. Važno je pronaći pravu ravnotežu, razborito koristiti prisilu tipa za koncizan i prikladan kod i oslanjati se na eksplicitnu konverziju tipa za namjerne i predvidljive konverzije tipa.