.

.

niedziela, 21 maja 2017

Typy danych w JavaScripcie

Szybka ściągawka z typów danych w JS. W pigułce. :)

Najkrócej rzecz ujmując, w JavaScripcie typy danych dzielimy na proste i złożone.


TYPY PROSTE

Prostych typów jest pięć (uwaga dla fanów mnemotechniki: podwójne "P" - pięć prostych ;)):

  1. string, czyli napis
  2. var string = "Jestem napisem!"
    

  3. number, czyli liczba
    (jest jeden wspólny typ, tzn. nie ma rozróżnienia na liczby całkowite i rzeczywiste)
  4. var number = 19;
    
    var number = 6.5;
    

  5. boolean, czyli true lub false
  6. var boolean = true;
    

  7. undefined, czyli coś niezdefiniowanego (nie wiadomo co)
  8. var something;
    
    var something = undefined;
    

  9. null, czyli brak wartości
  10. var nothing = null;
    

To tyle, jeśli chodzi o ECMAScript 5.

Wersja 6 ECMAScript (z 2015 roku) wprowadziła dodatkowy, szósty typ prosty: symbol.

var symbol1 = Symbol();

var symbol2 = Symbol("napis"); // parametr (w którym przekazujemy string)
// jest opcjonalny; to opis służący wyłącznie do debbugowania

Wywołanie funkcji Symbol() każdorazowo zwraca anonimową, unikalną wartość typu symbol. Wartość ta może być używana jako klucz właściwości obiektu, gdy chcemy, aby dana właściwość była prywatna (dostępna wyłącznie wewnątrz danej funkcji lub obiektu).


Coś extra, czyli FALSY VALUES

Wspomniane wcześniej typy undefined oraz null poza tym, że wzbudzają konsternację i semantyczno-logiczne trudności (różnica między nimi jest na tyle subtelna, że trudno ująć ją w słowach; nie do końca wiadomo, czemu służyć ma to rozróżnienie na brak wartości i wartość nieznana/nieokreślona), to należą do tzw. falsy values, czyli wartości, które w pewnych kontekstach rzutowane są do false. Zahaczamy tutaj o temat koercji - rozwinę ten wątek w wolnej chwili. :)

Falsy values w JS jest aż sześć - pełna lista poniżej:

  • undefined
  • null
  • 0
  • "", czyli pusty string (o długości = 0), bez żadnego znaku (uwaga! znakiem jest też spacja, to: " " nie jest pusty string)
  • false (czyli jedna z wartości booleana)
  • NaN (not a number)


TYPY ZŁOŻONE

Najpowszechniejsze, najczęstsze typy złożone w JS to:

  1. obiekty
  2. var object = {
      width: 10;
      length: 10;
      color: "blue";
    };
    

  3. tablice / listy
  4. udostępniają operacje typowe zarówno dla list (np. pop, push), jak i dla tablic (np. new Array(10), array[3]); dlatego Array w JS jest - w zależności od sposobu użycia - albo tablicą, albo listą, albo tym i tym jednocześnie
    var array = ["jajka", "masło", 7];
    

  5. funkcje
  6. function(a, b) {
      c = 7;
      return a + b * c;
    }
    

  7. obiekty stworzone przez własne konstruktory
  8. function Area(width, length) = {
      this.width = width;
      this.lenght = length;
    }
    
    var myArea = new Area(12, 10);
    

Z typami złożonymi rzecz ma się tak, że w ostatecznym rozrachunku wszystkie są obiektami. Czyli dziedziczą po Object.prototype, który ma to do siebie, że można na nim przypiąć dowolny atrybut (parę klucz-wartość). W związku z tym otwiera się - dość nieoczywista - możliwość przypinania atrybutów na liście czy funkcji. Przykład poniżej:

var array = ["jajka", "masło", 7];

array.cost = 1000;

To, że można to robić, nie znaczy, że trzeba i że jest to dobre. :) Tworzymy w ten sposób programistycznego Frankensteina. Stosowanie takich dziwacznych, hybrydowych struktur raczej nie wpłynie dobrze na czytelność kodu.


Na zakończenie i rozluźnienie - podejrzane typy od Jarońskiego. Załatwiają swoje ciemne sprawki. ;)



4 komentarze:

  1. W sumie to typów prostych jest sześć, bo w ES6 dodane dodatkowo symbol → https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Symbol

    OdpowiedzUsuń
    Odpowiedzi
    1. Dzięki, zaktualizowałam post. BTW - spotkałam się z opinią, że symbol jest bardzo rzadko używany. Zdarza Ci się z niego korzystać?

      Usuń
  2. Mała uwaga:
    "string, czyli napis" -> powiedziałym raczej string, czyli ciąg znakowy (a dokładniej ciąg reprezentujący znaki Unicode), bo np. "123" to string, ale 123 to number.

    "null, czyli brak wartości" raczej powiedziałym, że undefined to brak wartości, natomiast null to wartość "pusta", która w niektórych przypadkach jest ja najbardziej wartością oczekiwaną i ponad to w pełni poprawną wartością np. do zapisania w bazie danych SQL.

    "listy" raczej stosuje się terminologię "tablice", choć de facto nie są to takie same tablice jak np. w PHP. w JS tablice to obiekty dziedziczące po Array.prototype


    "var list = ["jajka", "masło", 7];
    list.cost = 1000;"
    bardzo zła praktyka... tak jak piszesz, to że coś można, nie znaczy że dobrze jest to robić.
    Warto jednak pokazać jakiś przykład, chociażby z iterowaniem po takiej tablicy pętlami for-in oraz for-of:

    for (let v of list) {console.log(v)}
    //"jajka"
    //"masło"
    //7

    i teraz...

    for (let i of list) {console.log(list[i])}
    //"jajka"
    //"masło"
    //7
    //1000

    Nie wnikam tutaj w kwestię, która z pętli jest lepsza, chodzi mi tylko o pokazanie problemu.

    Pozdrawiam

    OdpowiedzUsuń
    Odpowiedzi
    1. Dzięki za podzielenie się przemyśleniami. ;) Doprecyzowałam info dot. Array. Pętli z ES6 jeszcze nie znam, ale rozumiem, że w drugim przykładzie miało być for (let i in list) (bo zapis: for (let i of list) {console.log(list[i])} nie zwraca tego, co napisałeś).
      Pozdrawiam :)

      Usuń