Automatyczna konwersja typów danych
Jak już wiesz, ciągi znaków w JavaScript należy ujmować w cudzysłów. Może się zdarzyć, że wszystkimi znakami ciągu będą cyfry:
let a = '123';
W tym przypadku zmienna a również jest
ciągiem znaków, ale z pewnym niuansem.
Istota niuansu jest następująca: jeśli na ciągu znaków z cyframi wykonamy jakąkolwiek operację matematyczną - operacja ta zostanie wykonana tak, jakbyśmy faktycznie mieli liczby, a nie ciągi znaków:
alert('2' * '3'); // wyświetli 6
W tym przypadku JavaScript widzi, że próbujemy wykonać niedozwoloną dla ciągów znaków, ale dozwoloną dla liczb operację.
Widzi również, że faktycznie nasze ciągi znaków - to liczby w cudzysłowie. Dlatego JavaScript automatycznie wykonuje konwersję tych ciągów znaków na liczby i wykonuje odpowiednią operację matematyczną na nich.
To działa, jeśli w naszych ciągach znaków są tylko
cyfry. Jeśli będzie tam choć jedna litera
- JavaScript uzna operację za nieprawidłową
i ustawi jej wynik na wartość NaN:
alert('2' * '3s'); // wyświetli NaN
Ponadto, automatyczna konwersja zachodzi, jeśli operacja jest matematycznie poprawna, ale niedozwolona dla ciągów znaków.
Na przykład, ciągów znaków nie można (a liczby można) mnożyć, dzielić, odejmować, więc we wszystkich takich operacjach nastąpi automatyczna konwersja ciągów znaków z cyframi na liczby.
Jednakże, ciągi znaków, podobnie jak liczby, są dodawane
za pomocą operatora +. Oznacza to,
że w przypadku dodawania automatycznej konwersji
nie będzie:
let a = '1' + '2';
alert(a); // wyświetli '12' - nastąpiło dodanie ciągów znaków
Jeśli jeden ze składników jest liczbą, a drugi - ciągiem znaków, to zawsze wygrywa ciąg znaków:
let a = 1 + '2';
alert(a); // wyświetli '12'
W takich przypadkach JavaScript, wręcz przeciwnie, automatycznie konwertuje liczby na ciągi znaków i wykonuje dodawanie ciągów znaków.
Istnieją jednak niuanse, gdy składników jest więcej niż dwa: w tym przypadku konwersja do określonego typu zależy od kolejności wykonywania operacji.
W następnym przykładzie najpierw 2 i 3
dodadzą się jako liczby, a następnie wynik zostanie dodany
do ciągu znaków '1' już jako ciąg znaków '5',
co ostatecznie da ciąg znaków '15':
let a = '1' + (2 + 3);
alert(a); // wyświetli '15'
Jeśli jednak usuniemy nawiasy, wszystko będzie dodawane
od lewej do prawej. To znaczy najpierw do ciągu znaków '1'
zostanie dodana liczba 2 i w wyniku
powstanie ciąg znaków '12'. Następnie do tego
ciągu znaków zostanie dodana liczba 3 i w wyniku
powstanie ciąg znaków '123':
let a = '1' + 2 + 3;
alert(a); // wyświetli '123'
A w następnym przykładzie liczby 2
i 3 są napisane na początku, więc najpierw
dodadzą się jako liczby, dając w wyniku
liczbę 5, a następnie do tej liczby zostanie dodany
ciąg znaków '1', dając ostatecznie ciąg znaków '51':
let a = 2 + 3 + '1';
alert(a); // wyświetli '51'
Nie uruchamiając kodu, określ, co wyświetli się na ekranie:
let a = '5' + '2';
alert(a);
Nie uruchamiając kodu, określ, co wyświetli się na ekranie:
let a = '5' + 2;
alert(a);
Nie uruchamiając kodu, określ, co wyświetli się na ekranie:
let a = 5 + '2';
alert(a);
Nie uruchamiając kodu, określ, co wyświetli się na ekranie:
let a = 5 + 2;
alert(a);
Nie uruchamiając kodu, określ, co wyświetli się na ekranie:
let a = '5' * '2';
alert(a);
Nie uruchamiając kodu, określ, co wyświetli się na ekranie:
let a = '5' - '2';
alert(a);
Nie uruchamiając kodu, określ, co wyświetli się na ekranie:
let a = '5' / '2';
alert(a);
Nie uruchamiając kodu, określ, co wyświetli się na ekranie:
let a = '5' % '2';
alert(a);
Nie uruchamiając kodu, określ, co wyświetli się na ekranie:
let a = '5s' * '2';
alert(a);
Nie uruchamiając kodu, określ, co wyświetli się na ekranie:
let a = '5s' + '2';
alert(a);
Nie uruchamiając kodu, określ, co wyświetli się na ekranie:
let a = (-'5') + (-'2');
alert(a);
Nie uruchamiając kodu, określ, co wyświetli się na ekranie:
let a = '5' * 1 + '2' * 1;
alert(a);
Nie uruchamiając kodu, określ, co wyświetli się na ekranie:
let a = '5' * '1' + '2' * '1';
alert(a);
Nie uruchamiając kodu, określ, co wyświetli się na ekranie:
let a = '' + 3 + 1;
alert(a);