Работа с флагове в JavaScript

Сега ще се научим да работим с флагове. Флагът е специална променлива, която може да приема само две стойности: true и false. С помощта на флагове могат да се решават задачи, проверяващи липсата на нещо: например, може да се провери дали в масив няма елемент с определена стойност. Давайте да започнем.

Нека решим следната задача: даден е масив с числа, трябва да се провери дали в него има елемент със стойност 3 или не. Ако има - извеждаме '+++', ако няма - извеждаме '---'.

Първо, нека се опитаме да изведем '+++'. За това ще обходим всички елементи на нашия масив и с условна проверка ще питаме - дали текущият елемент е равен на стойността 3. Ако е равен - извеждаме '+++':

javascriptlet arr = [1, 2, 3, 4, 5];

for (let elem of arr) {
  if (elem == 3) {
    console.log('+++');
  }
}

Но нашето решение не е много добро: защото ако в масива има не една стойност 3, а няколко, то '+++' ще се изведе няколко пъти. Нека поправим нашия масив (ще направим два елемента със стойност 3) и да се убедим в това:

javascriptlet arr = [1, 2, 3, 4, 3, 5];

for (let elem of arr) {
  if (elem == 3) {
    console.log('+++'); // ще изведе няколко пъти
  }
}

Нека поправим проблема: ще прекратим цикъла с помощта на break, ако елементът вече е намерен:

javascriptlet arr = [1, 2, 3, 4, 3, 5];

for (let elem of arr) {
  if (elem == 3) {
    console.log('+++');
    break;  // прекратяваме цикъла
  }
}

Сега нека се опитаме да направим така, че, ако в масива изобщо няма елементи със стойност 3, да се извежда '---'. Често срещано заблуждение е да се добави else към нашата условна проверка - в този случай '---' ще се извежда за всички елементи, които не са 3:

javascriptlet arr = [1, 2, 3, 4, 5];

for (let elem of arr) {
  if (elem == 3) {
    console.log('+++'); // ще изведе за елемента 3
  } else {
    console.log('---'); // ще изведе за елементите 1, 2, 4, 5
  }
}

И така, идеята да добавим else - е лоша идея, не работи. За решаване на задачи от този тип (такива задачи се срещат доста често) се използват така наречените флагове.

Както вече беше споменато по-горе, флагът е такава променлива, която може да приема две стойности: true или false.

И така, нека направим променлива flag с такова значение: ако тя е равна на true, то в масива има елемент 3, а ако е false, то такъв елемент няма.

Първоначално ще зададем променливата flag да има стойност false - тоест ще считаме, че елемент 3 няма в масива:

javascriptlet arr = [1, 2, 3, 4, 5];
let flag = false; // считаме, че елемент 3 няма в масива

След това ще стартираме цикъл с условна проверка така, както сме го правили преди. Ако цикълът открие, че в масива има елемент 3 - тогава ще зададем променливата flag да има стойност true и ще излезем от цикъла с помощта на break:

javascriptlet arr = [1, 2, 3, 4, 5];
let flag = false; // считаме, че елемент 3 няма в масива

for (let elem of arr) {
  if (elem == 3) {
    flag = true; // елементът има - преназначаваме променливата flag
    break; // излизаме от цикъла
  }
}

Отговорът на въпроса, дали в масива има 3 или не, можем да дадем само след цикъла. И този отговор вече го имаме: след цикъла променливата flag може да е останала false или може да е сменила стойността си на true, ако цикълът е открил в масива 3:

javascriptlet arr = [1, 2, 3, 4, 5];
let flag = false;

for (let elem of arr) {
  if (elem == 3) {
    flag = true;
    break;
  }
}

// тук променливата flag е равна или на true, или на false

Сега след цикъла можем да направим условна проверка, която ще погледне променливата flag и ще изведе на екрана '+++' или '---':

javascriptlet arr = [1, 2, 3, 4, 5];
let flag = false;

for (let elem of arr) {
  if (elem == 3) {
    flag = true;
    break;
  }
}

if (flag === true) {
  console.log('+++');
} else {
  console.log('---');
}
Задание 1

Даден е масив:

javascriptlet arr = ['a', 'b', 'c', 'd', 'e'];

Проверете дали в този масив има елемент 'c'. Ако има - изведете '+++', а ако няма - изведете '---'.

Задание 2

Напишете код, който ще проверява числото дали е просто или не. Простото число се дели само на единица и на себе си, и не се дели на други числа.