Created by
За да започнете с първият си език за програмиране, не е необходимо да сте запознати с понятията, дадени в следното видео, но все пак помага ;)
Във видеото за илюстрация е използван езика C, но концепциите са валидни за всеки един език за програмиране.
Български език | JavaScript | |
---|---|---|
роман, разказ и пр | <=> | program/script |
параграф, абзац | <=> | block |
изречение | <=> | инструкция |
Една JS програма се интерпретира последователно, ред по ред, освен в случаите, когато имаме условни оператори и функции, които ще бъдат детайлно разгледани в следващите теми.
// това е коментар, който не се изпълнява от системата
// показва „изскачащо“ съобщение с текст „Welcome“
alert("Welcome");
// декларира променливата answer
let answer;
// записва числото 42 в променливата answer
answer = 42;
// изписва стойността на answer в конзолата
console.log( answer );
// задава червен фон на документа
document.body.style.backgroundColor = "red";
Тук всички "инструкции" се разделят една от друга с ';'
let x = 1;
let y = 2;
let z;
var
.
let
и const
, които ще разгледаме след като изясним понятията "scope" и "hoisting".
let x; // деклариране на променливата x
x = 10; // записваме в x стойност 10
let y; // деклариране на променливата y
let a,b; // деклариране на променливите a и b
let x = 10; // деклариране и инициализиране на x със стойността 10
В JavaScript, променлива може да се създаде и без да се декларира явно с var
/let или const. Например:
x = 10; // (Error in strict mode)
console.log(x);
Това се счита за изключително лоша практика, тъй като се създава "глобална променлива" (в темата за scope, ще разгледаме защо), и в новите версии на езика (от ЕС5.1) при използването на strict mode, това би довело до грешка!
// global variable in strict-mode:
'use strict';
x = 10; // Uncaught ReferenceError: x is not defined
console.log(x);
Повече информация: Strict_mode @MDN
break delete for let super void
case do function new switch while
catch else if package this with
class enum implements private throw yield
const export import protected true
continue extends in public try
debugger false instanceof return typeof
default finally interface static let
Препоръчва се имената на променливите да описват данните, които възнамеряваме да съхраняваме в тях.
Не бихте искали програмата ви да изглежда така:
А по-скоро така:
camelCasedName = 'something';
let x; // ок
let $x; // позволено, но не се препоръчва
let userName; // ок
let user name; // SyntaxError!
let username; // ok, но е по-трудно четима и не е според конвенцията (lowerCamelCase)
let user-first-name; //SyntaxError
let user_first_name; //ok, но не е според конвенцията (lowerCamelCase)
let userFirstName; //ok
let x234AB$$53; // синтактично е ок, но какво ли означава?
// цяло число, положително
let x = 10;
// цяло число, отрицателно
let y = -5;
// реално число
const pi = 3.14;
// реално число, експонентен запис:
let million = 1e6;
xey
се чете като x*10y
let budget = 1_234_000_000
let userName = 'Ada Byron'; // ок
let nickName = "LadyLovelace"; //ок
let quotGood = 'И той отсече - "Ще вали!"'; //ок
let quotBad = "И той отсече - "Ще вали!""; //SyntaxError
let foo = "What's the time?" //ок
\
escape character in string:Ако в низ използваме символа '\
' (backslash), то той не се тълкува буквално, а заедно със непосредствено следващия го символ образуват т.нар. ескейп последователност, която има специално значение.
\n: | line feed | нов ред |
\t: | horizontal tab | таб |
\": | Double quotation mark | двойни кавички, които не се тълкуват като специален символ |
\': | Single quotation mark | кавичка, която не се тълкува като специален символ |
\\: | backslash | не се тълкува като специален символ |
console.log('1. Ето какво прави "\\n": --->\n<---');
console.log('2. Ето какво прави "\\t": --->\t<---');
console.log('3. Ето какво прави "\\"": --->\"<---');
console.log('4. Ето какво прави "\\\'": --->\'<---');
1. Ето какво прави "\n": --->
<---
2. Ето какво прави "\t": ---> <---
3. Ето какво прави "\"": --->"<---
4. Ето какво прави "\'": --->'<---
let lyrics = "В късна нощ — преди години — сам над книгите старинни,
безотраден, вниквах, жаден, в знания незнайни тук; —
скръбен, търсех без сполука мир във тайната наука —
но оборен в сънна скука, чух внезапно бавен звук."
// Uncaught SyntaxError: Invalid or unexpected toke
let lyrics = "В късна нощ — преди години — сам над книгите старинни,\nбезотраден, вниквах, жаден, в знания незнайни тук; —\nскръбен, търсех без сполука мир във тайната наука —\nно оборен в сънна скука, чух внезапно бавен звук."
let lyrics = "В късна нощ — преди години — сам над книгите старинни," +
"безотраден, вниквах, жаден, в знания незнайни тук; —" +
"скръбен, търсех без сполука мир във тайната наука —" +
"но оборен в сънна скука, чух внезапно бавен звук.";
` и `
(backticks).
let lyrics = `В късна нощ — преди години — сам над книгите старинни,
безотраден, вниквах, жаден, в знания незнайни тук; —
скръбен, търсех без сполука мир във тайната наука —
но оборен в сънна скука, чух внезапно бавен звук.`
console.log( `2 + 4 = ${2+4}` )
// 2 + 4 = 6
let firstName = "Ada";
console.log(`Hello, ${firstName}, how are you today?`)
// Hello, Ada, how are you today?
console.log(`234 + 432 = ${234 + 432}`)
// 234 + 432 = 666
let x = 3, y = 4;
console.log(`x = ${x}, y = ${y}, x+y = ${x+y}`)
// x = 3, y = 4, x+y = 7
Данните от този тип могат да приемат само 2 стойности: true или false
Използват се предимно в условните оператори, които са разгледани по-нататък.
let start = true;
let stop = false;
Използва се при работа с обекти, които са разгледани по-нататък.
null е примитивен тип, а не обект! Факта, че оператора typeof null;
връща "object" се дължи на всеизвестен бъг в JavaScript ( The history of “typeof null” by Dr. Axel Rauschmayer)
null
и undefined
ще разгледаме след като се запознаем с обектите в JS.typeof
console.log( typeof 5 );
// number
console.log( typeof "Ada" );
// string
console.log( typeof true );
// boolean
console.log( typeof undefined );
// undefined
console.log( typeof null );
// object
// но това е споменатия вече бъг в JS
let res = 0 / "a";
console.log( res ); // NaN
console.log( typeof(res) ); // number
+
'
console.log(2 + 4); //6
console.log(2 + -4); //-2
-
'
console.log(20 - 4); //16
console.log(20 - -4); //24
*
'
console.log(2 * 4); //8
console.log(2 * -4); //-8
/
'
console.log(100 / 5); //20
console.log(100 / -5); //-20
console.log(7 / 2); //3.5
console.log(0.1+0.2);
// 0.30000000000000004
%
'Връща остатъка от целочислено делене
console.log( 0 % 3 ); // 0
console.log( 1 % 3 ); // 1
console.log( 2 % 3 ); // 2
console.log( 3 % 3 ); // 0
console.log( 4 % 3 ); // 1
console.log( 5 % 3 ); // 2
console.log( 6 % 3 ); // 0
console.log( 7 % 3 ); // 1
console.log( 8 % 3 ); // 2
console.log( 9 % 3 ); // 0
Reference: Remainder @MDN
**
Въвежда се от 2016г. в ES7. Внимавайте, ако трябва да поддържате по-стари браузъри: caniuse **
console.log(2**10); //1024
За по-стари браузери използваме Math.power()
console.log(Math.pow(2,10)); //1024
Reference: Степенуване @MDN
let i = 2;
//postfix increment:
let j = i++; // j = 2, i = 3
//prefix increment:
let j = ++i; // j = 3, i = 3
let i = 2;
//postfix decrement:
let j = i--; // j = 2, i = 1
//prefix decrement:
let j = --i; // j = 1, i = 1
let x = 1;
console.log(x++); //1
console.log(x); //2
let y = 1;
console.log(++y); //2
console.log(y); //2
let x = 1;
let y = 1;
console.log( x++ + ++y); // 3
console.log(`x = ${x}`); // x = 2
console.log(`y = ${y}`); // y = 2
За по-сложни математически операции, може да използвате методите на вградения в езика Math object
Math.round(3.65); //4
Math.pow(2,10); // 1024
Math.min(1,2,3,4,5); // 1
Math.max(1,2,3,4,5); // 5
+
'
let firstName = "Ada";
let surName = "Byron";
console.log (firstName + " " + surName); // "Ada Byron"
console.log(2+"1"); // 21
let x = "42";
console.log(x + 2); // 422 защото в x имаме низ
console.log(typeof(x)) // string
console.log(x*1 + 2); // 44 защото x*1 е число
console.log(typeof(x*1)) // number
=
'
LHS = RHS;
// декларираме променливите x и y:
let x, y;
// записваме в паметта, сочена от x, числото 3:
x = 3;
// в x записваме стойността на x, повдигната на степен 2:
x = x ** 2; // след този израз в x имаме стойността 9
let x, y = 1;
x = y; // тук четем от y и записваме в x
// декларираме променливите x и y
let x,y;
// присвояваме и на двете променливи стойността 1
y = x = 1;
console.log(`x = ${x}`); // x = 1
console.log(`y = ${y}`); // y = 1
let x = 4;
x += 3; // x = x + 3;
x -= 3; // x = x - 3;
x *= 3; // x = x * 3;
x /= 3; // x = x / 3;
x %= 3; // x = x % 3;
console.log( 3+2**2**3/2 )
// резултата е 131, защото:
// '**' => приоритет 14, от дясно на ляво
// '/' => приоритет 13, от ляво на дясно
// '+' => приоритет 12, от ляво на дясно
// 3+2**(2**3)/2=>
// 3+(2**8)/2=>
// 3+(256/2)=>
// 3+128 =>
// 131
Създаване на променливи и основни операции с простите типове данни.
See the Pen Simple variables and operations by Iva Popova (@webdesigncourse) on CodePen.
See the Pen BMI simplest calculation by Iva Popova (@webdesigncourse) on CodePen.
console.log(2 == 2); // true
console.log(2 == "2"); // true (the string is coerced to a number value.)
console.log(2 === "2"); // false (no type coercion)
// the Boolean operand "true" is converted to 1; "false" is converted to 0
console.log(true == 1); // true
console.log(false == 0); // true
console.log(true > false); // true
// lexicographic order, when both operands are strings
console.log( "2" > "19999" ) // true, as ("2" > "1") is true
console.log( "b" > "azzzz" ) // true, as ("b" > "a") is true
console.log( "1" < "11"); // true, as "none symbol" code is smaller than "1" symbol code
console.log( "2" > "11"); // true, as "2" code is bigger than "1" code
console.log( 'a' > 'A'); // true, as 'a' code is bigger than 'A' code
console.log( "1199" > "12"); // false, as "11">"12" is false
console.log( "1" == "12"); // false, as "none symbol" is not == "2"
expr1 | expr2 | AND expr1 && expr2 |
OR expr1 || expr2 |
NOT !expr1 |
---|---|---|---|---|
T | T | T (expr2) | T (expr1) | F |
T | F | F (expr2) | T (expr1) | F |
F | T | F (expr1) | T (expr2) | T |
F | F | F (expr1) | F (expr2) | T |
console.log( true && false ); // false
console.log( true || false ); // true
console.log( !true ); // false
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
let userAge = 19;
let userCountry = 'BG'
console.log( userAge>=18 && userCountry==='UK' ); // false ( true && false = false)
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// когато операндите не са boolean, то и резултата не е boolean
let userName;
console.log( userName || 'Anonymous' ) // 'Anonymous'
Type: | =False | =True |
---|---|---|
number | 0/NaN | всяко число, различно от 0/NaN |
string | "" | всеки низ, който не е празен |
undefined | undefined | - |
null | null | - |
See the Pen JS: Truth Values Evaluation by Iva Popova (@webdesigncourse) on CodePen.
if
statement
if(условие){
изрази, които ще се изпълнят, ако условието е истина
}
if( age > 18 ){
status = "adult";
}
if-else
statement
if( условие ){
изрази, които ще се изпълнят, ако условието е истина
}else {
изрази, които ще се изпълнят, ако условието е лъжа
}
if( age > 18 ){
status = "adult";
}else {
status = "child";
}
let x = 5;
if(x%2){
console.log(`Odd`);
}else{
console.log(`Even`);
}
if-else-if
statement
if( условие1){
изрази, които ще се изпълнят, ако условие1 е истина
}else if (условие2) {
изрази, които ще се изпълнят, ако условие1 e лъжа,
а условие2 е истина
}else {
изрази, които ще се изпълнят, ако нито едно от
горните условия не е истина
}
if{}
блокelse if{}
блокаelse{}
блока е винаги в края, като не е задължителен, но се препоръчва да присъства.if-else-if
statement - пример
if( age > 18 ){
status = "adult";
}else if( age < 18 && age > 12){
status = "teen";
}else{
status = "child"
}
В примера, който е коректен синтактично, има бъг - можете ли да го откриете?
switch
statement е алтернатива на множество else-if...else-if
, подходящ в случаите, когато трябва да се сравняват множество конкретни стойности на една променлива.
let fruit = "apple";
switch (fruit) {
case "apple":
console.log("Apple is red.");
break;
case "banana":
console.log("Banana is yellow.");
break;
default:
console.log("Unknown fruit.");
}
// Извежда: Apple is red.
switch
изразът сравнява стойността на fruit със стойностите във всеки case
.case
блок.break
прекратява switch
блока и предотвратява изпълнението на следващите case
блокове.default
блокът се изпълнява, ако никой от case
блоковете не съответства на стойността на fruit.
Условие ? Израз1 : Израз2
let x = 42;
let numType = x%2===0 ? "even" : "odd";
console.log(numType); // "even"
let x = 42, numType;
if(x%2===0){
numType = "even"
}else{
numType = "odd"
}
console.log(numType); // "even"
for
Statement: синтаксис
for (init; condition; increment) {
блок, който се изпълнява, докато condition
е истина
}
for(let i=0; i<5; i++){
console.log(i)
}
Стъпките, в един цикъл са:
init
: изпълнява се първа и само веднъжcondition
:increment
: изпълнява се след блока. Обикновено тук се променят променливите, които контролират цикъла.for
Statement: блок-схема
for (init; condition; increment) {
block
}
for
Statement: пример и program flow diagramfor
Statement: пример 1
for (let i = 0; i < 5; i++) {
console.log("i=" + i);
}
// резултата, видим в конзолата, е:
i=0
i=1
i=2
i=3
i=4
for
Statement: пример 2
// i е четно число, в интервала [0-10]
for (let i = 2; i <= 10; i = i+2){
console.log("i=", i);
}
// резултата, видим в конзолата, е:
i=2
i=4
i=6
i=8
i=10
for
Statement: пример 3
// create the list element
let listNode = document.createElement(listType);
//create list items
for (let i = 1; i <= listItemsCount; i++){
let listItem = document.createElement('li');
listItem.innerHTML = 'Item '+ i;
listNode.appendChild(listItem);
}
// attach to output node:
outputNode.appendChild( listNode );
for
Statement: пример 4
// half tree print
let treeDeep = 5;
for (let i = 1; i <= treeDeep; i++) {
console.log("*".repeat(i));
}
// резултата, видим в конзолата, е:
*
**
***
****
*****
for
Statement: пример 5
// full tree print
let crownHeight = 6;
let boleHeight = 2;
let boleWidth = 3;
let spaceCount;
// print the crown:
for (let i = 1; i <= crownHeight; i++) {
spaceCount = Math.floor(crownHeight) - i;
console.log(" ".repeat(spaceCount) + "*".repeat(i * 2 - 1));
}
// print the bole:
spaceCount = Math.floor((crownHeight * 2 - 1 - boleWidth) / 2);
for (let i = 1; i <= boleHeight; i++) {
console.log(" ".repeat(spaceCount) + "*".repeat(boleWidth));
}
резултата, видим в конзолата, е:
*
***
*****
*******
*********
***********
***
***
while
statement: синтаксис
while ( condition) {
блок, който се изпълнява, докато condition е истина
}
Стъпките, в един while
цикъл са:
За да се избегне безкраен цикъл, променливата в condition
трябва да променя стойността си в тялото на цикъла!
while
statement: алгоритъмwhile
statement: пример 1
let userTries = 5;
while( userTries>0){
console.log(`Try: ${userTries}`);
userTries--; // ако този ред липсва, цикълът става безкраен!
}
Забележете, че този пример, би било по-добре да бъде имплементиран чрез for
statement
for(let userTries = 5; userTries>0; userTries--){
console.log(`Try: ${userTries}`);
}
while
statement: пример 2Но когато не знаем предварително колко пъти ще се повтори цикъла използваме while
// Машината си "намисля" число:
let machineNumber = Math.round(Math.random() * 10);
console.log(`machineNumber: ${machineNumber}`);
// Потребителя "въвежда" число:
let userNumber = Math.round(Math.random() * 10);
console.log(`userNumber: ${userNumber}`);
while(userNumber != machineNumber){
// Потребителя "въвежда" ново число:
userNumber = Math.round(Math.random() * 10);
console.log(`new userNumber: ${userNumber}`);
}
Бихте ли могли да реализирате същата логика чрез for
цикъл?
do-while
statement: синтаксис
do{
блок, който се изпълнява, докато condition е истина
} while ( condition)
do-while
работи по същия начин както while
, с единствената разлика, че блокът в тялото на цикъла ще се изпълни поне веднъж, независимо от истинностната стойност на условието. do-while
statement: пример
// Машината си "намисля" число:
let machineNumber = Math.round(Math.random() * 10);
console.log(`machineNumber: ${machineNumber}`);
do{
// Потребителя "въвежда" число:
userNumber = Math.round(Math.random() * 10);
console.log(`userNumber: ${userNumber}`);
} while(userNumber != machineNumber)
break
и continue
В JavaScript се прави разлика между Statement и Expression
2+3; // 2+3 е Expresion
x = 5; // x = 5 e Expresion
console.log(x**6-x) // x**6-x e Expresion
x = y = 5; // тук имаме 2 Expresions: (y = 5) и (x = 5)
if()
са пример за Statements.
if(1){return 0}; // if Statement
while(x = 2){console.log(x)}; // while Statement
let x; // variable declaration Statement
See the Pen HW: JS increment operatorss by Iva Popova (@webdesigncourse) on CodePen.
See the Pen HW2: Comparison Operators & Conditional Statement by Iva Popova (@webdesigncourse) on CodePen.
See the Pen HW1: Comparison Operators & Conditional Statement by Iva Popova (@webdesigncourse) on CodePen.
See the Pen BMI Interpretation by Iva Popova (@webdesigncourse) on CodePen.
See the Pen HW: loops by Iva Popova (@webdesigncourse) on CodePen.
These slides are based on
customised version of
framework