Представьте, что нам нужно запросить у пользователя число, и если оно отрицательное, запросить снова. Даже если первое введенное число отрицательное, мы должны его как-то обработать (например, показать сообщение), прежде чем запросить снова.
javascript
let userInput;
do {
userInput = prompt("Введите положительное число:"); // prompt() - функция, которая запрашивает ввод у пользователя
console.log("Вы ввели: " + userInput);
} while (userInput < 0); // Условие проверяется ПОСЛЕ первого выполнения
console.log("Спасибо! Вы ввели корректное число.");
(Примечание: prompt() — это функция браузера, которая может отсутствовать в некоторых средах выполнения JS. Для полноты картины мы ее здесь упомянули.)
Когда использовать какой цикл:
for: Когда вы заранее знаете или можете вычислить количество повторений (например, пройти по всем элементам массива, сделать 10 итераций).
while: Когда вам нужно повторять действия до тех пор, пока выполняется некоторое условие, но точное количество повторений заранее неизвестно (например, ждать, пока сервер ответит, или пока баланс не станет меньше нуля).
do...while: Когда блок кода должен выполниться как минимум один раз, даже если условие изначально ложно.
Эти циклы предназначены для итерации (перебора) по элементам объектов и массивов.
А) Цикл for...in (для перебора свойств объектов)
Он перебирает имена (ключи) свойств объекта.
Синтаксис: for (let key in object) { // код с использованием object[key] }
javascript
let car = {
brand: "Toyota",
model: "Camry",
year: 2022
};
for (let key in car) {
console.log(`Ключ: ${key}, Значение: ${car[key]}`);
}
// Вывод:
// Ключ: brand, Значение: Toyota
// Ключ: model, Значение: Camry
// Ключ: year, Значение: 2022
Важно: for...in может перебирать свойства, унаследованные из прототипа объекта. Для простого перебора собственных свойств обычно используют Object.keys(object) в сочетании с обычным циклом for или forEach.
Б) Цикл for...of (для перебора значений итерируемых объектов)
Этот цикл предназначен для перебора значений элементов в итерируемых объектах, таких как массивы, строки, Map, Set.
Синтаксис: for (let value of iterable) { // код с использованием value }
Пример 4.5.1: Перебор массива
javascript
let colors = ["красный", "зеленый", "синий"];
for (let color of colors) {
console.log(color);
}
// Вывод:
// красный
// зеленый
// синий
Пример 4.5.2: Перебор строки
javascript
let text = "JS";
for (let char of text) {
console.log(char);
}
// Вывод:
// J
// S
Когда что использовать:
for...of — для перебора значений элементов массивов, строк и других итерируемых коллекций.
for...in — для перебора ключей (имен свойств) объектов.
Задание 1: Система аутентификации пользователей
javascript
// 1. Напишите функцию checkUserAccess(user), которая принимает объект пользователя
// с полями: role (строка), isActive (булево), subscriptionType (строка)
// 2. Реализуйте проверки:
// - Если пользователь не активен, вернуть "Доступ заблокирован"
// - Если роль "admin", вернуть "Полный доступ"
// - Если роль "user" и подписка "premium", вернуть "Расширенный доступ"
// - Если роль "user" и подписка "basic", вернуть "Базовый доступ"
// - Для всех остальных случаев - "Неизвестная роль"
// 3. Используйте конструкцию if...else if...else
Задание 2: Умный калькулятор скидок
javascript
// 1. Создайте функцию calculateDiscount(price, userType, purchaseCount)
// 2. Реализуйте логику расчета скидки с помощью switch и тернарных операторов:
// Базовая скидка:
// - "vip" - 20%
// - "regular" - 10%
// - "new" - 5%
// Дополнительная скидка за количество покупок:
// - Если purchaseCount > 10 - дополнительно 5%
// - Если purchaseCount > 5 - дополнительно 3%
// 3. Верните итоговую цену и размер скидки в процентах
Задание 3: Анализатор данных массива
javascript
// 1. Создайте функцию analyzeArray(numbers), которая принимает массив чисел
// 2. Используя циклы, найдите:
// - Максимальное и минимальное значение
// - Среднее арифметическое
// - Количество четных и нечетных чисел
// - Все простые числа в массиве
// 3. Верните объект с результатами анализа
Задание 4: Генератор отчетов
javascript
// 1. Дан массив объектов с товарами:
const products = [
{ name: "Телефон", price: 500, category: "electronics", stock: 15 },
{ name: "Книга", price: 20, category: "education", stock: 0 },
{ name: "Наушники", price: 100, category: "electronics", stock: 8 }
];
// 2. Используя циклы и условия, создайте отчеты:
// - Список товаров, которых нет в наличии
// - Общую стоимость всех товаров в категории "electronics"
// - Товары с ценой выше 50 и остатком менее 10
Решение задания 1:
javascript
function checkUserAccess(user) {
if (!user.isActive) {
return "Доступ заблокирован";
} else if (user.role === "admin") {
return "Полный доступ";
} else if (user.role === "user") {
return user.subscriptionType === "premium"
? "Расширенный доступ"
: "Базовый доступ";
} else {
return "Неизвестная роль";
}
}
// Примеры использования:
console.log(checkUserAccess({
role: "admin",
isActive: true,
subscriptionType: "premium"
})); // "Полный доступ"
console.log(checkUserAccess({
role: "user",
isActive: true,
subscriptionType: "basic"
})); // "Базовый доступ"
Решение задания 2:
javascript
function calculateDiscount(price, userType, purchaseCount) {
let baseDiscount = 0;
// Базовая скидка по типу пользователя
switch (userType) {
case "vip":
baseDiscount = 20;
break;
case "regular":
baseDiscount = 10;
break;
case "new":
baseDiscount = 5;
break;
default:
baseDiscount = 0;
}
// Дополнительная скидка за количество покупок
let extraDiscount = purchaseCount > 10 ? 5 : purchaseCount > 5 ? 3 : 0;
const totalDiscount = baseDiscount + extraDiscount;
const finalPrice = price * (1 - totalDiscount / 100);
return {
originalPrice: price,
finalPrice: finalPrice,
totalDiscount: totalDiscount,
baseDiscount: baseDiscount,
extraDiscount: extraDiscount
};
}
// Пример использования:
console.log(calculateDiscount(1000, "vip", 12));
// { originalPrice: 1000, finalPrice: 750, totalDiscount: 25, ... }
Решение задания 3:
javascript
function analyzeArray(numbers) {
if (numbers.length === 0) {
return { error: "Массив пуст" };
}
let max = numbers[0];
let min = numbers[0];
let sum = 0;
let evenCount = 0;
let oddCount = 0;
let primes = [];
// Основной цикл анализа
for (let i = 0; i < numbers.length; i++) {
const num = numbers[i];
// Поиск максимума и минимума
if (num > max) max = num;
if (num < min) min = num;
// Сумма для среднего значения
sum += num;
// Четные/нечетные
if (num % 2 === 0) {
evenCount++;
} else {
oddCount++;
}
// Проверка на простое число
if (isPrime(num)) {
primes.push(num);
}
}
return {
max: max,
min: min,
average: sum / numbers.length,
evenCount: evenCount,
oddCount: oddCount,
primes: primes,
totalCount: numbers.length
};
}
// Вспомогательная функция для проверки простых чисел
function isPrime(num) {
if (num < 2) return false;
for (let i = 2; i <= Math.sqrt(num); i++) {
if (num % i === 0) return false;
}
return true;
}
// Пример использования:
console.log(analyzeArray([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]));
Решение задания 4:
javascript
const products = [
{ name: "Телефон", price: 500, category: "electronics", stock: 15 },
{ name: "Книга", price: 20, category: "education", stock: 0 },
{ name: "Наушники", price: 100, category: "electronics", stock: 8 },
{ name: "Ручка", price: 5, category: "education", stock: 50 }
];
// 1. Товары не в наличии
const outOfStock = [];
for (let i = 0; i < products.length; i++) {
if (products[i].stock === 0) {
outOfStock.push(products[i].name);
}
}
// 2. Общая стоимость электроники
let electronicsTotal = 0;
for (let product of products) {
if (product.category === "electronics") {
electronicsTotal += product.price * product.stock;
}
}
// 3. Товары с ценой > 50 и остатком < 10
const criticalProducts = [];
let index = 0;
while (index < products.length) {
const product = products[index];
if (product.price > 50 && product.stock < 10) {
criticalProducts.push({
name: product.name,
price: product.price,
stock: product.stock
});
}
index++;
}
console.log("Нет в наличии:", outOfStock);
console.log("Общая стоимость электроники:", electronicsTotal);
console.log("Критические товары:", criticalProducts);
Чек-лист самопроверки
Я могу создавать сложные условия с помощью if/else и switch
Понимаю разницу между циклами for, while и for...of
Умею использовать тернарный оператор для простых условий
Могу анализировать данные массивов с помощью циклов и условий
Понимаю, когда использовать break и continue в циклах
Эти навыки необходимы для обработки данных, валидации ввода и создания сложной бизнес-логики в реальных приложениях.
Эта глава посвящена логике программы. Условия позволяют нам принимать решения, а циклы — повторять действия. Освоив эти конструкции, вы получите фундаментальные инструменты для создания более сложных и динамичных программ.
О проекте
О подписке
Другие проекты