Andmetüüpide automaatne teisendamine
Nagu te juba teate, tuleks JavaScriptis stringe võtta jutumärkidesse. Võib juhtuda, et kõik stringi sümbolid on numbrid:
let a = '123';
Sel juhul on muutuja a samuti
string, kuid väikese nüansiga.
Nüansi tuum on järgmine: kui stringi koos numbritega teha mõni matemaatiline tehe – tehakse see tehe nii, nagu meil oleksid tõepoolest numbrid, mitte stringid:
alert('2' * '3'); // kuvab 6
Sel juhul näeb JavaScript, et me üritame teha stringide jaoks keelatud, kuid numbrite jaoks lubatud tehet.
Ta näeb samuti, et tegelikult on meie stringid - numbrid jutumärkides. Seetõttu teeb JavaScript automaatselt nende stringide teisendamise numbriteks ja teostab nendega vastava matemaatilise tehte.
See toimib siis, kui meie stringides on ainult
numbrid. Kui seal on vähemalt üks täht
- peab JavaScript tehet vigaseks
ja teeb selle tulemuseks väärtuse NaN:
alert('2' * '3s'); // kuvab NaN
Lisaks toimub automaatne teisendamine siis, kui tehe on matemaatiliselt korrektne, kuid stringide jaoks ebasobiv.
Näiteks stringe ei saa (kuid numbreid saab) korrutada, jagada, lahutada, seetõttu toimub kõikides sellistes tehetes stringide numbritega automaatne teisendamine numbriteks.
Siiski liidetakse stringe, nagu ka numbreid,
operaatori + abil. See tähendab,
et liitmise korral automaatset teisendamist
ei toimu:
let a = '1' + '2';
alert(a); // kuvab '12' - toimus stringide liitmine
Kui üks liidetavatest on number ja teine - string, siis alati võidab string:
let a = 1 + '2';
alert(a); // kuvab '12'
Sellistel juhtudel teeb JavaScript vastupidiselt, automaatselt numbrite teisendamise stringideks ja teostab stringide liitmise.
Siiski on nüansse, kui liidetavaid on rohkem kui kaks: sel juhul sõltub teisendamine konkreetseks tüübiks tehete sooritamise järjekorrast.
Järgmises näites kõigepealt liidetakse 2 ja 3
numbritena ning seejärel liidetakse tulemus
stringiga '1' juba kui string '5',
mis annab lõpuks stringi '15':
let a = '1' + (2 + 3);
alert(a); // kuvab '15'
Kui aga sulud eemaldada, siis liidetakse kõik
vasakult paremale. See tähendab, et kõigepealt stringile '1'
liidetakse number 2 ja tulemuseks
saadakse string '12'. Seejärel sellele
stringile liidetakse number 3 ja tulemuseks
saadakse string '123':
let a = '1' + 2 + 3;
alert(a); // kuvab '123'
Kuid järgmises näites on numbrid 2
ja 3 kirjutatud alguses, seega kõigepealt
liidetakse need numbritena, saades tulemuseks
numbri 5, ning seejärel liidetakse sellele numbrile
string '1', saades lõpuks stringi '51':
let a = 2 + 3 + '1';
alert(a); // kuvab '51'
Koodi käivitamata määrake, mis kuvatakse ekraanil:
let a = '5' + '2';
alert(a);
Koodi käivitamata määrake, mis kuvatakse ekraanil:
let a = '5' + 2;
alert(a);
Koodi käivitamata määrake, mis kuvatakse ekraanil:
let a = 5 + '2';
alert(a);
Koodi käivitamata määrake, mis kuvatakse ekraanil:
let a = 5 + 2;
alert(a);
Koodi käivitamata määrake, mis kuvatakse ekraanil:
let a = '5' * '2';
alert(a);
Koodi käivitamata määrake, mis kuvatakse ekraanil:
let a = '5' - '2';
alert(a);
Koodi käivitamata määrake, mis kuvatakse ekraanil:
let a = '5' / '2';
alert(a);
Koodi käivitamata määrake, mis kuvatakse ekraanil:
let a = '5' % '2';
alert(a);
Koodi käivitamata määrake, mis kuvatakse ekraanil:
let a = '5s' * '2';
alert(a);
Koodi käivitamata määrake, mis kuvatakse ekraanil:
let a = '5s' + '2';
alert(a);
Koodi käivitamata määrake, mis kuvatakse ekraanil:
let a = (-'5') + (-'2');
alert(a);
Koodi käivitamata määrake, mis kuvatakse ekraanil:
let a = '5' * 1 + '2' * 1;
alert(a);
Koodi käivitamata määrake, mis kuvatakse ekraanil:
let a = '5' * '1' + '2' * '1';
alert(a);
Koodi käivitamata määrake, mis kuvatakse ekraanil:
let a = '' + 3 + 1;
alert(a);