Samodejna pretvorba podatkovnih tipov
Kot že veste, je treba nize v JavaScript zapreti v narekovaje. Lahko se zgodi, da so vsi znaki niza številke:
let a = '123';
V tem primeru je spremenljivka a prav tako
niska, vendar z določenimi posebnostmi.
Bistvo posebnosti je naslednje: če na nizu s številkami izvedemo katero koli matematično operacijo - bo ta operacija izvedena tako, kot da imamo res števila in ne nize:
alert('2' * '3'); // izpiše 6
V tem primeru JavaScript vidi, da poskušamo izvesti operacijo, ki ni dovoljena za nize, vendar je dovoljena za števila.
Prav tako vidi, da so naši nizi dejansko števila v narekovajih. Zato JavaScript avtomatično izvede pretvorbo teh nizov v števila in izvede ustrezno matematično operacijo nad njimi.
To deluje, če so v naših nizih samo
številke. Če bo tam vsaj ena črka
- bo JavaScript operacijo štela za neveljavno
in rezultat bo vrednost NaN:
alert('2' * '3s'); // izpiše NaN
Poleg tega se samodejna pretvorba zgodi, če je operacija matematično pravilna, vendar ni dovoljena za nize.
Na primer, nizov ni mogoče (števila pa lahko) množiti, deliti, odštevati, zato bo pri vseh takih operacijah prišlo do samodejne pretvorbe nizov s številkami v števila.
Vendar pa se nizi, tako kot števila, seštevajo
z operatorjem +. To pomeni,
da pri seštevanju ne bo prišlo do samodejne pretvorbe:
let a = '1' + '2';
alert(a); // izpiše '12' - prišlo je do seštevanja nizov
Če je en seštevanec število, drugi pa niska, vedno zmaga niz:
let a = 1 + '2';
alert(a); // izpiše '12'
V takih primerih JavaScript, nasprotno, samodejno pretvori števila v nize in izvede seštevanje nizov.
Obstajajo pa nianse, ko je seštevancev več kot dva: v tem primeru je pretvorba v določen tip odvisna od vrstnega reda izvajanja operacij.
V naslednjem primeru se bosta najprej 2 in 3
sešteli kot števili, nato pa se bo rezultat prištel
k nizu '1' že kot niz '5',
kar bo na koncu dalo niz '15':
let a = '1' + (2 + 3);
alert(a); // izpiše '15'
Če pa odstranimo oklepaje, se bo vse seštevalo
od leve proti desni. To pomeni, da se bo najprej k nizu '1'
prištelo število 2 in kot rezultat
bo nastal niz '12'. Nato se bo k temu
nizu prištelo število 3 in kot rezultat
bo nastal niz '123':
let a = '1' + 2 + 3;
alert(a); // izpiše '123'
V naslednjem primeru pa sta števili 2
in 3 zapisani na začetku, zato se bosta najprej
sešteli kot števili, kar bo dalo rezultat
število 5, nato pa se bo k temu številu prištel
niska '1', kar bo dalo niz '51':
let a = 2 + 3 + '1';
alert(a); // izpiše '51'
Brez zaganjanja kode določi, kaj se bo izpisalo na zaslon:
let a = '5' + '2';
alert(a);
Brez zaganjanja kode določi, kaj se bo izpisalo na zaslon:
let a = '5' + 2;
alert(a);
Brez zaganjanja kode določi, kaj se bo izpisalo na zaslon:
let a = 5 + '2';
alert(a);
Brez zaganjanja kode določi, kaj se bo izpisalo na zaslon:
let a = 5 + 2;
alert(a);
Brez zaganjanja kode določi, kaj se bo izpisalo na zaslon:
let a = '5' * '2';
alert(a);
Brez zaganjanja kode določi, kaj se bo izpisalo na zaslon:
let a = '5' - '2';
alert(a);
Brez zaganjanja kode določi, kaj se bo izpisalo na zaslon:
let a = '5' / '2';
alert(a);
Brez zaganjanja kode določi, kaj se bo izpisalo na zaslon:
let a = '5' % '2';
alert(a);
Brez zaganjanja kode določi, kaj se bo izpisalo na zaslon:
let a = '5s' * '2';
alert(a);
Brez zaganjanja kode določi, kaj se bo izpisalo na zaslon:
let a = '5s' + '2';
alert(a);
Brez zaganjanja kode določi, kaj se bo izpisalo na zaslon:
let a = (-'5') + (-'2');
alert(a);
Brez zaganjanja kode določi, kaj se bo izpisalo na zaslon:
let a = '5' * 1 + '2' * 1;
alert(a);
Brez zaganjanja kode določi, kaj se bo izpisalo na zaslon:
let a = '5' * '1' + '2' * '1';
alert(a);
Brez zaganjanja kode določi, kaj se bo izpisalo na zaslon:
let a = '' + 3 + 1;
alert(a);