Automātiskā datu tipu pārveidošana
Kā jūs jau zināt, virknes JavaScript ir jāieliek pēdiņās. Var gadīties, ka visi virknes simboli būs cipari:
let a = '123';
Šajā gadījumā mainīgais a arī ir
virkne, bet ar noteiktu niansi.
Nanses būtība ir sekojoša: ja virknei ar cipariem veic kādu matemātisku darbību - šī darbība tiks izpildīta tā, it kā mums patiešām būtu skaitļi, nevis virknes:
alert('2' * '3'); // izvadīs 6
Šajā gadījumā JavaScript redz, ka mēs mēģinām izpildīt virknēm neatļautu, bet skaitļiem atļautu darbību.
Tas arī redz, ka faktiski mūsu virknes - ir skaitļi pēdiņās. Tāpēc JavaScript automātiski pārveido šīs virknes par skaitļiem un izpilda atbilstošo matemātisko darbību ar tiem.
Tas strādā, ja mūsu virknēs ir tikai
cipari. Ja tur būs vismaz viens burts
- JavaScript uzskatīs darbību par nekorektu
un padarīs tās rezultātu par vērtību NaN:
alert('2' * '3s'); // izvadīs NaN
Turklāt automātiska pārveidošana notiek, ja darbība ir matemātiski korekta, bet nav atļauta virknēm.
Piemēram, virknes nevar (bet skaitļus var) reizināt, dalīt, atņemt, tāpēc visās šādās darbībās būs automātiska virkņu ar cipariem pārveidošana skaitļos.
Tomēr virknes, tāpat kā skaitļus, saskaita
ar operatoru +. Tas nozīmē,
ka saskaitīšanas gadījumā automātiskas pārveidošanas
nebūs:
let a = '1' + '2';
alert(a); // izvadīs '12' - notika virkņu saskaitīšana
Ja viens no saskaitāmajiem ir skaitlis, bet otrs - virkne, tad vienmēr uzvar virkne:
let a = 1 + '2';
alert(a); // izvadīs '12'
Šādos gadījumos JavaScript, gluži pretēji, automātiski pārveido skaitļus par virknēm un veic virkņu saskaitīšanu.
Tomēr ir nianses, kad saskaitāmie ir vairāk nekā divi: šajā gadījumā pārveidošana par noteiktu tipu ir atkarīga no darbību izpildes secības.
Nākamajā piemērā vispirms 2 un 3
tiks saskaitīti kā skaitļi, un tad rezultāts tiks pieskaitīts
virknei '1' jau kā virkne '5',
kas galu galā dos virkni '15':
let a = '1' + (2 + 3);
alert(a); // izvadīs '15'
Ja noņemam iekavas, tad viss tiks saskaitīts
no kreisās puses uz labo. Tas ir, vispirms virknei '1'
tiks pieskaitīts skaitlis 2 un rezultātā
veidosies virkne '12'. Pēc tam šai
virknei tiks pieskaitīts skaitlis 3 un rezultātā
veidosies virkne '123':
let a = '1' + 2 + 3;
alert(a); // izvadīs '123'
Bet nākamajā piemērā skaitļi 2
un 3 ir rakstīti sākumā, tāpēc vispirms
tie tiks saskaitīti kā skaitļi, dodot rezultātā
skaitli 5, un pēc tam šim skaitlim tiks pieskaitīta
virkne '1', dodot galu galā virkni '51':
let a = 2 + 3 + '1';
alert(a); // izvadīs '51'
Neveicot kodu, nosakiet, ko izvadīs uz ekrāna:
let a = '5' + '2';
alert(a);
Neveicot kodu, nosakiet, ko izvadīs uz ekrāna:
let a = '5' + 2;
alert(a);
Neveicot kodu, nosakiet, ko izvadīs uz ekrāna:
let a = 5 + '2';
alert(a);
Neveicot kodu, nosakiet, ko izvadīs uz ekrāna:
let a = 5 + 2;
alert(a);
Neveicot kodu, nosakiet, ko izvadīs uz ekrāna:
let a = '5' * '2';
alert(a);
Neveicot kodu, nosakiet, ko izvadīs uz ekrāna:
let a = '5' - '2';
alert(a);
Neveicot kodu, nosakiet, ko izvadīs uz ekrāna:
let a = '5' / '2';
alert(a);
Neveicot kodu, nosakiet, ko izvadīs uz ekrāna:
let a = '5' % '2';
alert(a);
Neveicot kodu, nosakiet, ko izvadīs uz ekrāna:
let a = '5s' * '2';
alert(a);
Neveicot kodu, nosakiet, ko izvadīs uz ekrāna:
let a = '5s' + '2';
alert(a);
Neveicot kodu, nosakiet, ko izvadīs uz ekrāna:
let a = (-'5') + (-'2');
alert(a);
Neveicot kodu, nosakiet, ko izvadīs uz ekrāna:
let a = '5' * 1 + '2' * 1;
alert(a);
Neveicot kodu, nosakiet, ko izvadīs uz ekrāna:
let a = '5' * '1' + '2' * '1';
alert(a);
Neveicot kodu, nosakiet, ko izvadīs uz ekrāna:
let a = '' + 3 + 1;
alert(a);