Automatická konverzia typov údajov
Ako už viete, reťazce v JavaScripte by mali byť uvedené v úvodzovkách. Môže sa stať, že všetky znaky reťazca budú číslice:
let a = '123';
V tomto prípade je premenná a tiež
reťazcom, ale s určitou nuansou.
Podstata nuansy je nasledovná: ak vykonáme nejakú matematickú operáciu s reťazcom obsahujúcim číslice - táto operácia sa vykoná tak, ako keby sme mali skutočne čísla, a nie reťazce:
alert('2' * '3'); // vypíše 6
V tomto prípade JavaScript vidí, že sa pokúšame vykonať operáciu, ktorá je pre reťazce nepovolená, ale pre čísla povolená.
Tiež vidí, že naše reťazce sú v skutočnosti čísla v úvodzovkách. Preto JavaScript automaticky vykoná konverziu týchto reťazcov na čísla a vykoná príslušnú matematickú operáciu s nimi.
Takto to funguje, ak v našich reťazcoch sú len
čísla. Ak tam bude aspoň jedno písmeno
- JavaScript považuje operáciu za nekorektnú
a jej výsledkom bude hodnota NaN:
alert('2' * '3s'); // vypíše NaN
Okrem toho, automatická konverzia prebieha, ak je operácia matematicky korektná, ale je nepovolená pre reťazce.
Napríklad, reťazce nie je možné (na rozdiel od čísel) násobiť, deliť, odčítať, preto vo všetkých takýchto operáciách prebehne automatická konverzia reťazcov s číslicami na čísla.
Avšak, reťazce, rovnako ako čísla, sa sčítavajú
pomocou operátora +. To znamená,
že v prípade sčítania automatická konverzia
neprebehne:
let a = '1' + '2';
alert(a); // vypíše '12' - došlo k sčítaniu reťazcov
Ak je jeden sčítanec číslo a druhý - reťazec, vždy zvíťazí reťazec:
let a = 1 + '2';
alert(a); // vypíše '12'
V takýchto prípadoch JavaScript, naopak, automaticky konvertuje čísla na reťazce a vykoná sčítanie reťazcov.
Existujú však nuansy, keď je sčítancov viac ako dva: v tomto prípade konverzia na určitý typ závisí od poradia vykonávania operácií.
V nasledujúcom príklade sa najprv 2 a 3
sčítajú ako čísla a potom sa výsledok pripočíta
k reťazcu '1' už ako reťazec '5',
čo nakoniec dá reťazec '15':
let a = '1' + (2 + 3);
alert(a); // vypíše '15'
Ak však odstránime zátvorky, všetko sa bude sčítať
zľava doprava. To znamená, že najprv k reťazcu '1'
sa pripočíta číslo 2 a výsledkom
bude reťazec '12'. Potom k tomuto
reťazcu sa pripočíta číslo 3 a výsledkom
bude reťazec '123':
let a = '1' + 2 + 3;
alert(a); // vypíše '123'
Avšak v nasledujúcom príklade sú čísla 2
a 3 napísané na začiatku, preto sa najprv
sčítajú ako čísla, čím vznikne výsledok
číslo 5, a potom k tomuto číslu sa pripočíta
reťazec '1', čím vznikne reťazec '51':
let a = 2 + 3 + '1';
alert(a); // vypíše '51'
Bez spustenia kódu určite, čo sa vypíše na obrazovku:
let a = '5' + '2';
alert(a);
Bez spustenia kódu určite, čo sa vypíše na obrazovku:
let a = '5' + 2;
alert(a);
Bez spustenia kódu určite, čo sa vypíše na obrazovku:
let a = 5 + '2';
alert(a);
Bez spustenia kódu určite, čo sa vypíše na obrazovku:
let a = 5 + 2;
alert(a);
Bez spustenia kódu určite, čo sa vypíše na obrazovku:
let a = '5' * '2';
alert(a);
Bez spustenia kódu určite, čo sa vypíše na obrazovku:
let a = '5' - '2';
alert(a);
Bez spustenia kódu určite, čo sa vypíše na obrazovku:
let a = '5' / '2';
alert(a);
Bez spustenia kódu určite, čo sa vypíše na obrazovku:
let a = '5' % '2';
alert(a);
Bez spustenia kódu určite, čo sa vypíše na obrazovku:
let a = '5s' * '2';
alert(a);
Bez spustenia kódu určite, čo sa vypíše na obrazovku:
let a = '5s' + '2';
alert(a);
Bez spustenia kódu určite, čo sa vypíše na obrazovku:
let a = (-'5') + (-'2');
alert(a);
Bez spustenia kódu určite, čo sa vypíše na obrazovku:
let a = '5' * 1 + '2' * 1;
alert(a);
Bez spustenia kódu určite, čo sa vypíše na obrazovku:
let a = '5' * '1' + '2' * '1';
alert(a);
Bez spustenia kódu určite, čo sa vypíše na obrazovku:
let a = '' + 3 + 1;
alert(a);