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

Флаги

Давайте решим следующую задачу: дан массив, нужно проверить, есть ли в нем элемент со значением 'c' или нет. Если есть - выведем 'есть', если нет - выведем 'нет'.

Для начала давайте попробуем вывести 'есть'. Для этого переберем все элементы нашего массива и ифом будем спрашивать - равен ли текущий элемент значению 'c'. Если равен - выведем 'есть':

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

for (var i = 0; i < arr.length; i++) {
	if (arr[i] == 'c') {
		alert('Есть');
	}
}

Но наше решение не очень хорошо: ведь если в массиве будет не одно значение 'c', а несколько, то алерт выведется несколько раз. Давайте исправим наш массив (сделаем два элемента с 'c') и убедимся в этом:

var arr = ['a', 'b', 'c', 'd', 'с'];

for (var i = 0; i < arr.length; i++) {
	if (arr[i] == 'c') {
		alert('Есть'); //выведет несколько раз
	}
}

Поправим проблему: оборвем цикл с помощью break, если элемент уже найден:

var arr = ['a', 'b', 'c', 'd', 'с'];
for (var i = 0; i < arr.length; i++) {
	if (arr[i] == 'c') {
		alert('Есть');
		break; //оборвем цикл
	}
}

Давайте теперь попробуем сделать так, чтобы, если в массиве вообще нет элементов со значением 'c', выводилось 'нет'. Распространенным заблуждением будет добавить else к нашему ифу - в этом случае 'нет' будет выводиться на все элементы, не являющиеся 'c':

var arr = ['a', 'b', 'c', 'd', 'с'];
for (var i = 0; i < arr.length; i++) {
	if (arr[i] == 'c') {
		alert('Есть');
	} else {
		alert('Нет'); //выведет на 'a', 'b' и 'd'
	}
}

Итак, идея добавить else - плохая идея, не рабочая. Для решения задач подобного типа (такие задачи встречаются достаточно часто) используют так называемые флаги.

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

Итак, давайте сделаем переменную flag с таким значением: если она равна true - то в массиве есть элемент 'c', а если false - то такого элемента нет.

Изначально поставим переменную flag в значение false - то есть будем считать, что элемента 'c' в массиве нет:

var arr = ['a', 'b', 'c', 'd', 'с'];
var flag = false; //считаем, что элемента 'c' нету в массиве

Затем запустим цикл с ифом так, как мы делали это раньше. Если цикл обнаружит, что в массиве есть элемент 'c' - то поставим переменную flag в значение true (и выйдем из цикла с помощью break).

for (var i = 0; i < arr.length; i++) {
	if (arr[i] == 'c') {
		flag = true; //элемент есть - переопределим переменную flag
		break;
	}
}

Далее: ответ на вопрос, если в массиве 'c' или нет, мы можем дать только после цикла. И этот ответ у нас уже есть: после цикла переменная flag могла остаться false или могла сменить свое значение на true, если цикл обнаружил в массиве 'c':

var arr = ['a', 'b', 'c', 'd', 'с'];
var flag = false; //считаем, что элемента 'c' нету в массиве

for (var i = 0; i < arr.length; i++) {
	if (arr[i] == 'c') {
		flag = true; //элемент есть - переопределим переменную flag
		break;
	}
}

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

Теперь после цикла мы можем сделать иф, который посмотрит на переменную flag и выведет на экран 'есть' или 'нет':

var arr = ['a', 'b', 'c', 'd', 'с'];
var flag = false; //считаем, что элемента 'c' нету в массиве

for (var i = 0; i < arr.length; i++) {
	if (arr[i] == 'c') {
		flag = true; //элемент есть - переопределим переменную flag
		break;
	}
}

if (flag === true) {
	alert('Есть');
} else {
	alert('Нет');
}

Таким образом и работают флаги. Запомните этот прием - он обязательно встретится вам в дальнейшем, причем неоднократно.

Флаги в функции

Когда мы работаем с пользовательскими функциями - флаги тоже можно и нужно использовать, но работа с ними упрощается. Давайте решим ту же задачу на 'c', но таким образом: необходимо создать функцию hasElem, которая параметром будет принимать массив и возвращать true, если 'c' есть в массиве, и false - если нет:

var arr = ['a', 'b', 'c', 'd', 'с'];
alert(hasElem(arr)); //выведет true или false

Давайте реализуем функцию hasElem. В этом случае переменная flag и команда break нам не понадобится - вместо них все сделает команда return.

Как это будет: внутри функции запускаем наш цикл с ифом и, если мы попали в иф - делаем return true, тем самым выходя из цикла и из функции. А если цикл прокрутился, но выхода из функции не случилось - после цикла делаем return false:

function hasElem(arr) {
	for (var i = 0; i < arr.length; i++) {
		if (arr[i] == 'c') {
			return true;
		}
	}

	return false; //элемент 'c' не найден
}
var arr = ['a', 'b', 'c', 'd', 'с'];
alert(hasElem(arr));

Еще раз как это работает: если в массиве найдется элемент со значением 'c' - мы выйдем из функции с помощью return. Но если в массиве не найдется элемент 'c' - выхода из функции не произойдет и выполнение дойдет до команды return false. И получится, что функция вернет false в знак того, что элемент 'c' не найден в массиве.