{Вземане на решения}

Оператор if

if (логически_израз) {
   блок с код, който ще се изпълни, ако логически_израз има стойност true
}

//Пример 1

let hour = 15;
if (hour < 18) {
  var greeting = "Good day";
}
console.log(greeting);

//log: Good day

//Пример 2

let hour = 19;
if (hour < 18) {
  var greeting = "Good day";
}
console.log(greeting);

//log: ReferenceError: greeting is not defined

Оператор if … else

if (логически_израз) {
   блок с код, който ще се изпълни, ако логически_израз има     стойност true
}
else{
   блок с код, който ще се изпълни, ако логически_израз има стойност false
}

//Пример

let hour = 19;
if (hour < 18) {
  var greeting = "Good day";
} 
else {
  greeting = "Good evening";
} 
console.log(greeting);

//log: Good evening

Оператор else if

if (логически_израз_1) {
    блок с код, който ще се изпълни, ако логически_израз_1 има     стойност true
}
else if (логически_израз_2) {
    блок с код, който ще се изпълни, ако логически_израз_1 има     стойност false, а логически_израз_2 има стойност true

else if (логически_израз_3) {
    блок с код, който ще се изпълни, ако логически_израз_2 има     стойност false, а логически_израз_3 има стойност true


else {
    блок с код, който ще се изпълни, ако всички логически_израз_х по-горе имат стойност false

//Пример

let time = 17;
if(time < 10){
  var greeting = "Good morning";
}
else if(time < 20){
  greeting = "Good day";
}
else{
  greeting = "Good evening";
}

//log: "Good day"

Булева конверсия

Операторът if (…) оценява израза в скоби и го преобразува в булев тип. Понякога условието може да бъде стойност, а не логически израз. Затова е важно да знем, че:
* стойностите: числото нула (0), празният низ (), неопределените стойности (undefined) и NaN (Not a number) имат стойност FALSE.
* всички останали стойности се приемат за TRUE.

Ето защо следният израз няма да се изпълни никога

if (0) { // 0 is falsy
  ...
}

а следващият, винаги ще се изпълни

if (1) { // 1 is truthy
  ...
}

Можем също така да прехвърлим предварително оценена булева стойност на if.
Пример:

let cond = (year == 2019); // тук равенството се оценява като вярно или невярно

if (cond) {
  ...
}

Множествен тернарен оператор
Допуска се използване на поредица от тернарни оператори в един израз.
Използване на последователност от тернарни оператори, позолява връщане на стойност, зависеща от няколко условия.

let age = prompt('age?', 18);

let message = (age < 3) ? 'Hi!' :
  (age < 18) ? 'Hello!' :
  (age < 100) ? 'Greetings!' :
  'What an unusual age!';

console.log(message);

 Оператор switch…case

switch(x) {
  case 'value1':  // if (x === 'value1')
    ...
    [break]

  case 'value2':  // if (x === 'value2')
    ...
    [break]

  [default:
    ...
    [break]]
}
  • Стойността на x се проверява за стриктно равенство (по тип и стойност) със стойността от първия случай (тоест: value1), след това към второто (value2) и така нататък.
  • Ако е намерено равенство, switch започва да изпълнява кода, започвайки от съответния случай, до най-близкия break (или до края на switch).
  • Ако няма съвпадение на случай, се изпълнява кодът по подразбиране (блока с код след default) ако съществува.

Конструкцията следва да отговаря на следните условия:

  • във всеки switch може да има произволен брой случаи (case)
  • стойностите след case могат да бъдат само константи
  • стойностите след case трябва да отговарят по тип на променливата в switch
  • ако бъде пропуснат brake; в някой от случаите (case), изпълнението на програмата ще продължи от следващия case
  • стойността след всеки case трябва да бъде уникална
  • блока default не е задължителен
//Пример

var grade = 6; 
switch(grade) { 
   case 6: { 
      console.log("Отличен"); 
      break; 
   } 
   case 5: { 
      console.log("Много добър"); 
      break; 
   }
   case 4: { 
      console.log("Добър"); 
      break;    
   } 
   case 3: { 
      console.log("Среден"); 
      break; 
   }
   case 2: { 
      console.log("Слаб"); 
      break; 
   }  
   default: { 
      console.log("Невалидна оценка"); 
      break;              
   } 
} 
//Пример на switch без break
let a = 2 + 2;

switch (a) {
  case 3:
    console.log( 'Too small' );
  case 4:
    console.log( 'Exactly!' );
  case 5:
    console.log( 'Too big' );
  default:
    console.log( "I don't know such values" );
}

В този случай, след като намери първото съвпадение и го изпълни, switch няма да приключи а ще продължи да изпълнява следващите случаи, поради липсата на break.
В конзолата ще се изведе:

Групи „case“

Switch допуска групиране на няколко варианта, ако те споделят един и същи код:

let a = 2 + 2;

switch (a) {
  case 4:
    alert('Right!');
    break;

  case 3:                    // (*) групиране на варианти
  case 5:
    alert('Wrong!');
    alert("Why don't you take a math class?");
    break;

  default:
    alert('The result is strange. Really.');
}

Възможността да се групират варианти е страничен ефект от начина, по който switch / case работи без прекъсвания (break). Тук изпълнението на случай 3 започва от линията (*) и минава през случай 5, защото няма прекъсване.

Задача 1

Преработете следния код, като използвате if вместо switch

switch (browser) {
  case 'Edge':
    console.log( "You've got the Edge!" );
    break;

  case 'Chrome':
  case 'Firefox':
  case 'Safari':
  case 'Opera':
    console.log( 'Okay we support these browsers too' );
    break;

  default:
    console.log( 'We hope that this page looks ok!' );
}

Задача 2

Преработете следния код, използвайки switch вместо if
*В случая, оператора +, работи като метода Number – опитва се да конвертира входа към число. Ако не успее, връща NaN
Пример:
let arg = +prompt(„Enter a value?“);
console.log(typeof(arg) + arg);

вход: 4 > изход: number4
вход: test > изход: numberNaN

let a = +prompt('a?');

if (a == 0) {
  console.log( 0 );
}
if (a == 1) {
  console.log( 1 );
}

if (a == 2 || a == 3) {
  console.log( '2,3' );
}
Реклами