Automaattinen tietotyyppien muunnos
Kuten jo tiedät, merkkijonot JavaScriptissä tulee laittaa lainausmerkkeihin. Voi olla tilanne, että kaikki merkkijonon merkit ovat numeroita:
let a = '123';
Tässä tapauksessa muuttuja a on myös
merkkijono, mutta siinä on erityispiirre.
Erityispiirteen ydin on seuraava: jos merkkijonolle numeroilla suoritetaan jokin matemaattinen operaatio - tämä operaatio suoritetaan niin kuin meillä todella olisi numeroita, eivätkä merkkijonot:
alert('2' * '3'); // tulostaa 6
Tässä tapauksessa JavaScript näkee, että me yritämme suorittaa merkkijonoille kelpaamatonta, mutta numeroille sallittua operaatiota.
Se näkee myös, että käytännössä merkkijonot ovat numeroita lainausmerkeissä. Siksi JavaScript muuntaa automaattisesti nämä merkkijonot numereiksi ja suorittaa vastaavan matemaattisen operaation niille.
Tämä toimii, jos merkkijonoissamme on vain
numeroita. Jos siellä on ainakin yksi kirjain
- JavaScript pitää operaatiota virheellisenä
ja tekee sen tuloksesta arvon NaN:
alert('2' * '3s'); // tulostaa NaN
Lisäksi automaattinen muunnos tapahtuu, jos operaatio on matemaattisesti oikein, mutta ei sallittu merkkijonoille.
Esimerkiksi merkkijonoja ei voi (mutta numerot voi) kertoa, jakaa, vähentää, joten kaikissa tällaisissa operaatioissa tapahtuu automaattinen muunnos merkkijonoista numeroiksi.
Kuitenkin merkkijonot, kuten numerot, lasketaan yhteen
operaattorilla +. Tämä tarkoittaa,
että yhteenlaskussa automaattista muunnosta
ei tapahdu:
let a = '1' + '2';
alert(a); // tulostaa '12' - tapahtui merkkijonojen yhteenlasku
Jos toinen yhteenlaskettavista on numero, ja toinen - merkkijono, niin merkkijono aina voittaa:
let a = 1 + '2';
alert(a); // tulostaa '12'
Tällaisissa tapauksissa JavaScript, päinvastoin, automaattisesti muuntaa numerot merkkijonoiksi ja suorittaa merkkijonojen yhteenlaskun.
On kuitenkin vivahteita, kun yhteenlaskettavia on enemmän kuin kaksi: tässä tapauksessa muunnos tiettyyn tyyppiin riippuu operaatioiden suoritusjärjestyksestä.
Seuraavassa esimerkissä ensin 2 ja 3
lasketaan yhteen numeroina, ja sitten tulos lisätään
merkkijonoon '1' jo merkkijonona '5',
mikä lopulta antaa merkkijonon '15':
let a = '1' + (2 + 3);
alert(a); // tulostaa '15'
Jos sulut kuitenkin poistetaan, kaikki lasketaan
vasemmalta oikealle. Eli ensin merkkijonoon '1'
lisätään numero 2 ja tuloksena
saadaan merkkijono '12'. Sitten tähän
merkkijonoon lisätään numero 3 ja tuloksena
saadaan merkkijono '123':
let a = '1' + 2 + 3;
alert(a); // tulostaa '123'
Mutta seuraavassa esimerkissä numerot 2
ja 3 on kirjoitettu alkuun, joten ensin
ne lasketaan yhteen numeroina, jolloin tulokseksi
tulee numero 5, ja sitten tähän numeroon lisätään
merkkijono '1', jolloin tulokseksi saadaan merkkijono '51':
let a = 2 + 3 + '1';
alert(a); // tulostaa '51'
Määritä käynnistämättä koodia, mitä näytetään ruudulla:
let a = '5' + '2';
alert(a);
Määritä käynnistämättä koodia, mitä näytetään ruudulla:
let a = '5' + 2;
alert(a);
Määritä käynnistämättä koodia, mitä näytetään ruudulla:
let a = 5 + '2';
alert(a);
Määritä käynnistämättä koodia, mitä näytetään ruudulla:
let a = 5 + 2;
alert(a);
Määritä käynnistämättä koodia, mitä näytetään ruudulla:
let a = '5' * '2';
alert(a);
Määritä käynnistämättä koodia, mitä näytetään ruudulla:
let a = '5' - '2';
alert(a);
Määritä käynnistämättä koodia, mitä näytetään ruudulla:
let a = '5' / '2';
alert(a);
Määritä käynnistämättä koodia, mitä näytetään ruudulla:
let a = '5' % '2';
alert(a);
Määritä käynnistämättä koodia, mitä näytetään ruudulla:
let a = '5s' * '2';
alert(a);
Määritä käynnistämättä koodia, mitä näytetään ruudulla:
let a = '5s' + '2';
alert(a);
Määritä käynnistämättä koodia, mitä näytetään ruudulla:
let a = (-'5') + (-'2');
alert(a);
Määritä käynnistämättä koodia, mitä näytetään ruudulla:
let a = '5' * 1 + '2' * 1;
alert(a);
Määritä käynnistämättä koodia, mitä näytetään ruudulla:
let a = '5' * '1' + '2' * '1';
alert(a);
Määritä käynnistämättä koodia, mitä näytetään ruudulla:
let a = '' + 3 + 1;
alert(a);