Първи стъпки в JavaScript — част 3

Това е трета част от въведението в JavaScript, което правя. И тук ще представя някои основни принципи в програмирането, валидни в почти всички езици. Така че ако имате предишен опит в програмирането можете просто да игнорирате този урок. Ако обаче до момента не сте имали никакво взимане-даване с програмиране, препоръчвам ви да прочетете този урок след като вече сте прегледали предните два:

Условия

В предния урок споменах, че следва да разгледаме условията в програмирането. На английски терминът е “if-statement”.

Като цяло ще забележите, че обичам да използвам английските термини при работа с компютърни езици. Това е, защото най-често те са и пряко свързани със синтаксиса. Освен това на английски можете да намерите много повече информация, отколкото на български. Все пак тези уроци са предназначени към българската аудитория, затова всеки път ще описвам новите неща на български и на английски. В последствие най-често ще използвам понятието в оригиналния му вариант (на английски).

Условията се използват в случай, в който искаме програмата/скриптът ни да извършва различни действия в зависимост от стойност на променлива или резултат от някакъв израз.

Например можем да направим един скрипт, който да ни съобщава, ако сме закъснели за работа. В примера ще приемем, че началото на работното ни време е 9.

var time = new Date();

if (time.getHours() > 9) {
    alert('Закъсняваш!');
}

В скрипта отначало създаваме нова променлива time, на която назначаваме стойност нов обект от тип Date. За типове обекти ще говорим друг път. За момента просто ще кажем, че по този начин променливата получава стойност отговаряща на конкретен момент от времето. По начина, по който сме я създали, този момент е моментът на самото ѝ инициализиране.

Синтаксис на условие

Пишем if, последван от скоби. С тях заграждаме самото условие, което поставяме. След това имаме блок от код заграден в големи (още ги наричаме фигурни) скоби. Този блок от код ще се изпълни само ако условието е вярно. С други думи — ако стойността на условието е равнозначна на булева променлива със стойност true.

Нека изясним какво представлява условието от нашия пример. В условието използваме променливата time, като след нея пишем точка. Чрез тази точка можем да достъпим белези (property-та) на променливата. В случая нашата променлива е обект, така че би могла да има property-та или методи. Методите на една променлива са функции/действия, които се извършват и дават резултат определена стойност.

Математика

В предния урок казах, че програмирането има доста общо с математиката, така че нека тук да разгледаме какви са точно приликите.

В училище по математика сме учили за функции. Мисля, че беше в 8-ми клас, така че всеки трябва да има достатъчни познания по въпроса. Ако случайно някой по-малък чете този урок — нека не се отчайва! Щом още от тази възраст чете уроци по програмиране от блогове, най-вероятно е достатъчно умен. По математика функциите ги описвахме горе-долу така:

f(x) = 2x+3

Това например е функция от X, която като резултат връща стойността на X умножена по 2 и накрая прибавя 3. По математика сме учили, че f(x) можем да го присвоим на Y:

y = f(x)

Линейна функция

И сега може да ни накарат да начертаем графиката на функцията. Да речем, че сме учили в училище и си спомняме, че функции от типа ax+b, където a и b са константи (ехх… в предния урок май говорихме за константи и променливи) се наричат линейни. Това е така, защото графиката им е права линия. Да речем, че си спомняме една аксиома от 5-ти клас, която гласи, че през две точки минава точно една права. Значи за да построим графиката, трябва да намерим две точки, през които минава тази права. След това трябва просто да съединим точките и сме готови. Реално съединявайки точките получаваме само отсечка, но ако я продължим до безкрай става права.

Как обаче да намерим две точки? В случая алгебрата се свежда до геометрия. Там сме учили за координатни системи (май пак беше 5-ти клас). Декартовата координатна система, която използваме по презюнкция, има абсциса и ордината. Абсцисата е права по X, която е хоризонтална. Ординатата е по Y, която е вертикална. Не е случайно това, че функцията я присвоихме на y, а самата функция беше от променливата x. Ако заместим X с 0, получаваме:

y = 2*0 + 3
y= 3

Ето, че вече имаме една точка с координати (0, 3).

Нека заместим X с произволно число, например 3, и пресметнем какво се получава за Y:

y = 2 * 3 + 3
y = 6 + 3
y = 9

Вече имаме и втора точка с координати (3, 9).

Ако съединим двете точки вече няма да има нужда да пресмятаме функцията. Вместо това можем просто по графиката ѝ да определим много други стойности на Y за определена стойност на X.

Извод

И сега какъв е изводът? Какво е функция? Функцията е поредица от действия, които трябва да извършим, при което получаваме резултат. В общия случай резултатът е еднакъв при еднакъв аргумент, подаден на функцията. Все пак трябва да се има предвид и случаи на функции, които отчитат някаква произволност. Тогава вече една и съща функция, с един и същи аргумент има различна стойност. Но за момента няма да се обременяваме с такива неща.

Аналогии между математиката и програмирането

Нека кажем още 2-3 думи за някои съвпадащи термини в математиката и програмирането. Смятам, че е полезно да се знаят, за да ни е по-лесно да разгадаем смисълът в програмирането. Невероятно улеснение е, ако знаем как е мислил този, който е създал самият език за програмиране. Защото той го е създал така, че да му е удобен на него самия.

Преди малко споменахме отново константите. В математическото уравнение горе нарекохме стойностите a и b константи. Това е поради факта, че представяхме общ случай на линейна функция. Самите a и b в някоя конкретна функция биха били дефинирани с определени стойности. В нашия случай бяха равни съответно на 2 и 3.

Защо тогава ги наричаме константи? Те могат веднъж да са 2 и 3, а друг път да са 324 и 2364? Защото двата случая биха били на различни функции. В една конкретна функция, стойностите на константите са определени. По същия начин една програма може да работи с константа A = 5, а друг път да променим стойността на константата на 10. При самото изпълнение на програмата разчитаме на това, че имаме точно определено число, което остана неизменно. Надявам се, това да е внесло още малко яснота по въпроса за константите.

Обратно към JavaScript

Да се върнем на метода getHours(). Защо това да е метод (функция на обект)?

Защо да не е просто property?

За да отговорим на това, трябва първо да се изясни начинът, по който променливите за време пазят някаква стойност. Това се свежда до начина, по който самите компютри обработват понятието за време. При компютрите най-често времето се представя просто с броя измивали секунди от 01.01.1970 г насам.

Защо точно тогава?

Тази дата се счита за начало на компютърната епоха.

Какво точно ще рече това?

И аз искам да знам, но за момента така и не съм намерил отговор, който ми харесва. Вярно, че не съм и търсил достатъчно, но това е друг въпрос.

Конкретно в JavaScript времето всъщност не се пази като секунди изминали от 01.01.1970 до сега. Пази се като милисекунди (просто умножете по 1000). Така че стойността на една такава променлива, инициализирана по времето, в което пиша този урок е 1345056534032. Така че функцията getHours() прави нужните математически преобразувания, за да пресметне колко часа е на днешната дата и връща този резултат.

Иначе (else)

if-statement-ът поддържа и възможност да укажем какви действия искаме да извършим, ако условието не е изпълнено. Това се прави като добавим else (иначе):

var time = new Date();

if (time.getHours() > 9) {
    alert('Закъсняваш');
}

if (time.getHours() < 9) {
    alert('Има още време');
}

if (time.getHour() > 9) {
    alert('Закъсняваш');
} else {
    alert('Има още време');
}

Надявам се виждате как двата if-а можем да заменим с if-else и да получим същия резултат.

Разбира се след else можем да имаме и нов if, така че да направим скрипт, който ни поздравява по различен начин в зависимост от това колко часа е в момента:

var time = new Date();

if (time.getHours() < 11) {
    alert('Добро утро!');
} else if (time.getHours() < 18) {
    alert('Добър ден!');
} else {
    alert('Добър вечер!');
}

На човешки език:

  • ако е преди 11 кажи “Добро утро!”
  • иначе ако (е по-късно и) е преди 6 следобед кажи “Добър ден”
  • иначе (ако е по-късно и от това) кажи “Добър вечер”.

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

Този сайт използва Akismet за намаляване на спама. Научете как се обработват данните ви за коментари.