Automatická konverze datových typů
Jak již víte, řetězce v JavaScriptu by se měly psát do uvozovek. Může se stát, že všechny znaky řetězce budou číslice:
let a = '123';
V tomto případě je proměnná a také
řetězec, ale s určitým nuancem.
Podstata nuance je následující: pokud nad řetězcem s číslicemi provedete nějakou matematickou operaci - tato operace bude provedena tak, jako bychom měli skutečně čísla, ne řetězce:
alert('2' * '3'); // vypíše 6
V tomto případě JavaScript vidí, že se pokoušíme provést operaci, která je pro řetězce nedovolená, ale pro čísla povolená.
Zároveň vidí, že naše řetězce jsou vlastně čísla v uvozovkách. Proto JavaScript automaticky provede převod těchto řetězců na čísla a provede příslušnou matematickou operaci nad nimi.
Toto funguje, pokud jsou v našich řetězcích pouze
číslice. Pokud tam bude alespoň jedno písmeno
- JavaScript považuje operaci za nekorektní
a jejím výsledkem bude hodnota NaN:
alert('2' * '3s'); // vypíše NaN
Kromě toho k automatické konverzi dochází, pokud je operace matematicky korektní, ale pro řetězce nedovolená.
Například, řetězce nelze (na rozdíl od čísel) násobit, dělit, odečítat, proto ve všech takových operacích dojde k automatické konverzi řetězců s číslicemi na čísla.
Avšak, řetězce, stejně jako čísla, se sčítají
pomocí operátoru +. To znamená,
že v případě sčítání k automatické konverzi
nedojde:
let a = '1' + '2';
alert(a); // vypíše '12' - došlo ke spojení řetězců
Pokud je jeden sčítanec číslo, a druhý - řetězec, vždy vyhraje řetězec:
let a = 1 + '2';
alert(a); // vypíše '12'
V takových případech JavaScript naopak automaticky převede čísla na řetězce a provede spojení řetězců.
Existují však nuance, když je sčítanců více než dva: v tomto případě konverze na určitý typ závisí na pořadí provádění operací.
V následujícím příkladu se nejprve 2 a 3
sečtou jako čísla, a poté se výsledek přičte
k řetězci '1' již jako řetězec '5',
což nakonec dá řetězec '15':
let a = '1' + (2 + 3);
alert(a); // vypíše '15'
Pokud však odstraníme závorky, vše se bude sčítat
zleva doprava. To znamená, že nejprve k řetězci '1'
se přičte číslo 2 a výsledkem
bude řetězec '12'. Poté k tomuto
řetězci se přičte číslo 3 a výsledkem
bude řetězec '123':
let a = '1' + 2 + 3;
alert(a); // vypíše '123'
V následujícím příkladu jsou však čísla 2
a 3 napsána na začátku, proto se nejprve
sečtou jako čísla, čímž vznikne výsledek
číslo 5, a poté k tomuto číslu se přičte
řetězec '1', čímž vznikne řetězec '51':
let a = 2 + 3 + '1';
alert(a); // vypíše '51'
Bez spuštění kodu určete, co se vypíše na obrazovku:
let a = '5' + '2';
alert(a);
Bez spuštění kodu určete, co se vypíše na obrazovku:
let a = '5' + 2;
alert(a);
Bez spuštění kodu určete, co se vypíše na obrazovku:
let a = 5 + '2';
alert(a);
Bez spuštění kodu určete, co se vypíše na obrazovku:
let a = 5 + 2;
alert(a);
Bez spuštění kodu určete, co se vypíše na obrazovku:
let a = '5' * '2';
alert(a);
Bez spuštění kodu určete, co se vypíše na obrazovku:
let a = '5' - '2';
alert(a);
Bez spuštění kodu určete, co se vypíše na obrazovku:
let a = '5' / '2';
alert(a);
Bez spuštění kodu určete, co se vypíše na obrazovku:
let a = '5' % '2';
alert(a);
Bez spuštění kodu určete, co se vypíše na obrazovku:
let a = '5s' * '2';
alert(a);
Bez spuštění kodu určete, co se vypíše na obrazovku:
let a = '5s' + '2';
alert(a);
Bez spuštění kodu určete, co se vypíše na obrazovku:
let a = (-'5') + (-'2');
alert(a);
Bez spuštění kodu určete, co se vypíše na obrazovku:
let a = '5' * 1 + '2' * 1;
alert(a);
Bez spuštění kodu určete, co se vypíše na obrazovku:
let a = '5' * '1' + '2' * '1';
alert(a);
Bez spuštění kodu určete, co se vypíše na obrazovku:
let a = '' + 3 + 1;
alert(a);