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 ;)):
string
, czyli napisnumber
, czyli liczba
(jest jeden wspólny typ, tzn. nie ma rozróżnienia na liczby całkowite i rzeczywiste)boolean
, czylitrue
lubfalse
undefined
, czyli coś niezdefiniowanego (nie wiadomo co)null
, czyli brak wartości
var string = "Jestem napisem!"
var number = 19; var number = 6.5;
var boolean = true;
var something; var something = undefined;
var nothing = null;
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 pustystring
(o długości = 0), bez żadnego znaku (uwaga! znakiem jest też spacja, to:" "
nie jest pustystring
)false
(czyli jedna z wartościbooleana
)NaN
(not a number)
TYPY ZŁOŻONE
Najpowszechniejsze, najczęstsze typy złożone w JS to:
- obiekty
- tablice / listy udostępniają operacje typowe zarówno dla list (np.
- funkcje
- obiekty stworzone przez własne konstruktory
var object = { width: 10; length: 10; color: "blue"; };
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];
function(a, b) { c = 7; return a + b * c; }
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. ;)
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ń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ńMała uwaga:
OdpowiedzUsuń"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
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ś).
UsuńPozdrawiam :)