Tablice i funkcje

Tablice

 

Jest to specjalny typ danych który zajmuje poszczególne komórki w pamięci zawsze koło siebie. Przez co możemy te dane przypisać pod jeden adres, czyli zmienną.

 

np. var tab = [1, 2, 3, 4, 5, 6];

 

Poszczególne elementy tablicy możemy wyciągać za pomocą indeksów które liczone są od 0 dla pierwszego elementu. Przykładowo jeśli chcielibyśmy odwołać się do drugiego elementu tablicy, czyli 2, powinniśmy wykorzystać następujący kod:

 

tab[1];

 

Jeśli zaś chcielibyśmy zmienić wartość 4 elementu tablicy, możemy wykonać to za pomocą operatora przypisania:

 

tab[3] = 13;

Zaktualizowana tablica wygląda teraz w ten sposób:

[1, 2, 3, 13, 5, 6];

Najpopularniejsze metody:

 

Funkcje

 

Funkcje to specjalne konstrukcje które pozwalają na zapamiętanie bloku

kodu pod konkretną zmienną i wielokrotnie go wykorzystywać odwołując się do jego nazwy. Deklaracja funkcji wygląda w następujący sposób:

 

function nazwaFunkcji() {

// kod który się wykonuje podczas wywołania // funkcji

}

 

Następnie wywołanie jej następuje po odwołaniu się do jej nazwy do dania nawiasów klamrowych tuż po.

 

nazwaFunkcji()

 

Dozwolony jest również taki sposób na deklaracje, który wykorzystuje funkcję anonimową i odpisuje ją do zmiennej:

 

var test = function () {
// kod

}

 

Jest on przydatny szczególnie gdy naszym zamiarem jest stworzenie funkcji pod właściwością obiektu.

Hosting

Deklaracje funkcji podlegają hoistingowi. Czyli że podczas interpretacji danego kawałka kodu jej deklaracja przeskakuje na sam początek, przez co dozwolone jest wywołanie funkcji przed jej zadeklarowaniem. Działa to w obrębie konkretnego bloku. By zaprezentować na czym to polega skorzystamy od razu z kolejnej właściwości czyli deklaracja funkcji w funkcji.

 

function nazwaFunkcji() {

nazwaFunkcji2();

function nazwaFunkcji2() {

// kod

}

}

 

Interpreter ten kawałek kodu zinterpretuje w następujący sposób:

 

function nazwaFunkcji() {

function nazwaFunkcji2() {

// kod

}

nazwaFunkcji2();

}

 

Możemy sobie podzielić również funkcje na takie które zwracają wartość lub nie. Różnią się od siebie tym że te drugie mają zaszyte w kodzie operator return.

Gdy jego nie zastosujemy nasza funkcja zwróci po prostu undefined.

Argumenty funkcji

Istnieje możliwość przekazywania wartości do funkcji podczas jej wywoływania. Dzięki temu nasze funkcje stają się jeszcze bardziej uniwersalne. Działa to na przykładzie:

 

function test(zmienna) {

return zmienna;

}

 

W momencie wywołania funkcji za pomocą poniższego przykładu zwróci nam argument który przekazaliśmy:

 

test('asdf'); // zwróci 'asdf'

 

Ta funkcja zwróci nam w tej sytuacji wartość typu String ‘asdf’. Co za tym idzie nie musimy deklarować typu zmiennej która ma przyjść do funkcji. Dodatkowo jeśli wykonamy wywołanie bez argumentu, konsola nie zwróci żadnego błędu. Ponadto możemy przekazywać więcej argumentów które w gruncie rzeczy nie zostały zadeklarowane. Np.

 

test('asdf', 'asdf2');

// kod zwróci 'asdf' lecz nie wywoła błędu o

// niezadeklarowanym argumencie

 

Jeśli naszą funkcję wywołamy w następujący sposób:

 

test(); // zwróci undefined

 

Funkcja zwróci undefined oraz nie pokaże błędu o brakującym argumencie.

Rozpatrzymy teraz dwa przypadki radzenia sobie z tym problemem. Jeśli chcemy obsługiwać wartości przekazywane przez funkcję bez deklarowania zmiennej w argumencie, możemy wykorzystać do tego specjalną wartość o nazwie arguments.

 

function test() {

return arguments;

}

 

Arguments jest specyficzną wartością z tego względu że teoretycznie zachowuje się jak tablica. Lecz w gruncie rzeczy tablicą nie jest. Możemy to sprawdzić wykonując następujący kod:

 

function coToTenArguments() {

console.log(arguments instanceof Array);

};

 

Który zwróci false. Różnica polega na tym że nie ma metod które domyślnie zawiera Array, więc nie wykonamy ani map, slice itp. Jeśli zależy nam na tych metodach możemy dokonać pewnego triku wykonując następujący kod:

 

var args = Array.from(arguments);

 

Dzięki temu stworzy nam już wartość typu Array.

W jaki sposób możemy poradzić sobie z nieprzekazywaniem wszystkich argumentów funkcji? Możemy określać domyślne wartości w przypadku kiedy danego argumentu nie ma:

 

function para(x, y) {

x = x || 0;

y = y || 0;

return [x, y];

}

 

Taki zapis pozwala nam nawet przy nie podaniu konkretnego argumentu mieć pod nim jakąś wartość, jak w tym przypadku zero.

Throw, try, catch

W JavaScript istnieje również dość ciekawa konstrukcja pozwalająca tworzyć funkcję bezpieczniejsze i wyłapywać błędy które sami określimy. Dla przykładu chcemy by nasza funkcja się nie wykonała jeśli w argumencie przekażemy stringa, ponieważ w dalszych linijkach kodu będziemy chcieli mieć pewność że napewno operujemy na liczbach. Możemy do tego wykorzystać operator throw.

 

function bledna(x) {

if (typeof x === 'string') {

throw new Error('testowy błąd');

}

}

 

Teraz za każdym razem gdy wywołamy tą funkcję zwróci nam błąd do konsoli, taki który zadeklarowaliśmy jako argument.

Czasami jednak może zdarzyć się sytuacja w której ten błąd będziemy chcieli w pewien sposób obsłużyć i wykonać konkretne operacje w kodzie jeśli on wystąpi. Służy do tego try, który sprawdza czy dany kod zawarty w nim nie wyrzuca żadnego błędu, jeśli jednak wystąpi przerzuca interpreter na działanie catch i kodu w którym jest zawarty.

 

try {

bledna(true)

} catch (blad) {

console.log(blad);

}