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:

javascriptlet 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:

javascriptalert('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:

javascriptalert('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:

javascriptlet 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:

javascriptlet 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':

javascriptlet 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':

javascriptlet 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':

javascriptlet a = 2 + 3 + '1';
alert(a); // vypíše '51'
Задание 1

Bez spuštění kodu určete, co se vypíše na obrazovku:

javascriptlet a = '5' + '2';
alert(a);
Задание 2

Bez spuštění kodu určete, co se vypíše na obrazovku:

javascriptlet a = '5' + 2;
alert(a);
Задание 3

Bez spuštění kodu určete, co se vypíše na obrazovku:

javascriptlet a = 5 + '2';
alert(a);
Задание 4

Bez spuštění kodu určete, co se vypíše na obrazovku:

javascriptlet a = 5 + 2;
alert(a);
Задание 5

Bez spuštění kodu určete, co se vypíše na obrazovku:

javascriptlet a = '5' * '2';
alert(a);
Задание 6

Bez spuštění kodu určete, co se vypíše na obrazovku:

javascriptlet a = '5' - '2';
alert(a);
Задание 7

Bez spuštění kodu určete, co se vypíše na obrazovku:

javascriptlet a = '5' / '2';
alert(a);
Задание 8

Bez spuštění kodu určete, co se vypíše na obrazovku:

javascriptlet a = '5' % '2';
alert(a);
Задание 9

Bez spuštění kodu určete, co se vypíše na obrazovku:

javascriptlet a = '5s' * '2';
alert(a);
Задание 10

Bez spuštění kodu určete, co se vypíše na obrazovku:

javascriptlet a = '5s' + '2';
alert(a);
Задание 11

Bez spuštění kodu určete, co se vypíše na obrazovku:

javascriptlet a = (-'5') + (-'2');
alert(a);
Задание 12

Bez spuštění kodu určete, co se vypíše na obrazovku:

javascriptlet a = '5' * 1 + '2' * 1;
alert(a);
Задание 13

Bez spuštění kodu určete, co se vypíše na obrazovku:

javascriptlet a = '5' * '1' + '2' * '1';
alert(a);
Задание 14

Bez spuštění kodu určete, co se vypíše na obrazovku:

javascriptlet a = '' + 3 + 1;
alert(a);