Zmienne w Javascript

Typy zmiennych

W Javascript (tak jak w wielu współczesnych językach skryptowych) każda zmienna jest typu dynamicznego. Oznacza to, że zmienna "a" może być w jednej chwili typu number ( liczba ), a za chwilę typu string ( łańcuch znaków). O tym jakiego typu jest to zmienna decyduje interpreter języka. Zobaczmy to na przykładzie:

  1. a = 5;
  2. alert(typeof(a));
  3. // wynik: number
  4. a = a + "ala ma kota"
  5. alert(typeof(a));
  6. // wynik: string

W linii 4 powyższego kodu zaszła konwersja typu number na typ string, a to wszystko dzięki operatorowi +. Teraz zmienna a ma wartość typu string "5ala ma kota".

Na co uważać?

Bardzo częstym błędem jest zapominanie o tym, że zmienna nie jest typu number tylko typu string. Przykładem gdzie ten błąd często występuje są pola formularza z których chcemy pobrać dane. Oto prosty przykład z formularzem, gdzie wpisujemy dwie liczby i chcemy je do siebie dodać.

  1. <form name="test">
  2. <input name="pierwsza" type="text" />
  3. <input name="druga" type="text" />
  4. <input value="wynik" type="button" onclick="wynik()" />
  5. </form>

I odpowedni do tego błędny kod Javascript:
  1. function wynik(){
  2. pierwsza = document.forms['test']['pierwsza'].value;
  3. druga = document.forms['test']['druga'].value;
  4. alert(pierwsza+druga);
  5. }

Gdy w pola formularza wpiszemy "1", a w drugie "2" i naciśniemy przycisk pokaże nam się w wyniku "12". Dlaczego? "1" i "2" są łańcuchami znakowymi ( zmiennymi typu string), a operator + działając na zmiennych typu string złącza je ze sobą (konkatenacja). Jak tego uniknąć i sprawić by nasz kod działał prawidłowo? Mamy dwa sposoby:
  1. function wynik(){
  2. pierwsza = parseInt( document.forms['test']['pierwsza'].value );
  3. druga = parseInt( document.forms['test']['druga'].value );
  4. alert(pierwsza+druga);
  5. }

Wywołując funkcję parseInt zmieniamy łańcuch znakowy na liczbę (wykonujemy konwersję między typami). Funkcja parseInt() zwraca nam liczbę całkowitą (parseInt(3.14) zwróci nam 3).
Drugim sposobem jest wymuszenie na interpreterze automatycznej konwersji w ten oto sposób:
  1. function wynik(){
  2. pierwsza =document.forms['test']['pierwsza'].value * 1;
  3. druga = document.forms['test']['druga'].value * 1;
  4. alert(pierwsza+druga);
  5. }

Mnożąc łańcuch znakowy przez 1 interpreter zakłada, że w tym łańcuchu znakowym musi być liczba i stara się przekonwertować automatycznie łańcuch znakowy na typ number. To rozwiązanie też działa, ale jest trochę mniej czytelne niż pierwsze.
Co jeśli ktoś wpisze w pierwsze pole literkę "a"? No cóż, w obu przypadkach interpreter przekonwertuje łańcuch na typ number. Pytanie tylko, jaka wartość znajdzie się w zmiennej "pierwsza"? Otóż znajdzie się tam wartość NaN (Not a Number), która będzie informować, że mimo zmienna jest typu number to jej wartość nie jest poprawną liczbą. Wywołując operacje matematyczne z NaN w wyniku otrzymamy zawsze NaN:
  1. alert(NaN + 1); // wynik: NaN
  2. alert(NaN * 2); // wynik: NaN
  3. alert(NaN - NaN); // wynik: NaN
  4. alert(NaN / NaN); // wynik: NaN

To jeszcze na koniec tego krótkiego kursu napiszę jak zapobiegać takim sytuacjom:
  1. function wynik(){
  2. pierwsza =document.forms['test']['pierwsza'].value * 1;
  3. druga = document.forms['test']['druga'].value * 1;
  4. if( isNaN(pierwsza) || isNaN(druga) ){
  5. alert("Wpisz liczby");
  6. } else {
  7. alert(pierwsza+druga);
  8. }
  9. }

W linii 4 sprawdzamy czy znajduje się w zmiennej NaN za pomocą funkcji isNaN() (zwraca prawdę, gdy w środku jest NaN, gdy jest poprawna liczba) i odpowiednio reagujemy na to wyświetlając komunikat, aby użytkownik wpisał nam liczby.
W następnym odcinku napiszę trochę o zasięgu i deklarowaniu zmiennych w Javascript.

Dodaj nową odpowiedź

  • Adresy internetowe są automatycznie zamieniane w klikalne odnośniki.
  • Dozwolone znaczniki HTML: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <h2> <h3> <h4>>
  • Znaki końca linii i akapitu dodawane są automatycznie.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <codehtml>, <javascript>, <php>. Beside the tag style "<foo>" it is also possible to use "[foo]".

Więcej informacji na temat formatowania

CAPTCHA
Zabezpieczenie przed spamem (dla niezarejestrowanych użytkowników) występują tylko małe litery (bez cyfr)
a
j
k
c
Enter the code without spaces and pay attention to upper/lower case.

Kurs Javascript

Logowanie