- Home »

Как писать условные операторы в JavaScript
Если ты занимаешься серверной разработкой, настройкой CI/CD пайплайнов или автоматизацией процессов, то JavaScript — это не просто язык для фронтенда. Это мощный инструмент для написания скриптов, автоматизации задач и даже серверных приложений на Node.js. И одна из самых важных вещей, которую нужно понимать — это как правильно писать условные операторы. От этого зависит логика твоих скриптов, их читаемость и производительность. Особенно это критично, когда ты пишешь скрипты для мониторинга серверов, обработки логов или автоматического деплоя.
Основы условных операторов: как это работает под капотом
JavaScript предлагает несколько способов написания условий, и каждый из них имеет свои особенности. Начнём с классического if...else
:
const serverStatus = 'online';
if (serverStatus === 'online') {
console.log('Server is running');
} else if (serverStatus === 'maintenance') {
console.log('Server is under maintenance');
} else {
console.log('Server is offline');
}
Но есть и более элегантные решения. Например, тернарный оператор для простых условий:
const isServerOnline = serverStatus === 'online';
const message = isServerOnline ? 'Server OK' : 'Server down';
console.log(message);
Для множественных условий отлично подходит switch
:
switch (serverStatus) {
case 'online':
console.log('All systems operational');
break;
case 'maintenance':
console.log('Scheduled maintenance');
break;
case 'offline':
console.log('Alert: Server down!');
break;
default:
console.log('Unknown status');
}
Быстрая настройка: пошаговое руководство
Давай разберём, как быстро организовать условную логику в твоих скриптах. Вот базовая структура файла для мониторинга сервера:
#!/usr/bin/env node
const fs = require('fs');
const { exec } = require('child_process');
// Функция проверки статуса сервера
function checkServerStatus(callback) {
exec('systemctl is-active nginx', (error, stdout, stderr) => {
if (error) {
callback('offline');
} else {
const status = stdout.trim();
callback(status === 'active' ? 'online' : 'offline');
}
});
}
// Основная логика с условными операторами
checkServerStatus((status) => {
if (status === 'online') {
console.log('✅ Nginx is running');
// Логика для работающего сервера
} else {
console.log('❌ Nginx is down');
// Логика для восстановления
exec('systemctl start nginx', (error) => {
if (!error) {
console.log('🔄 Nginx restarted successfully');
} else {
console.log('🚨 Failed to restart Nginx');
}
});
}
});
Практические примеры и кейсы
Рассмотрим несколько реальных сценариев использования условных операторов в серверной среде:
Пример 1: Мониторинг дискового пространства
const { execSync } = require('child_process');
function checkDiskSpace() {
try {
const output = execSync('df -h /').toString();
const usage = parseInt(output.split('\n')[1].split(/\s+/)[4]);
if (usage > 90) {
console.log('🚨 CRITICAL: Disk usage above 90%');
// Отправка алерта
sendAlert('disk_critical', usage);
} else if (usage > 80) {
console.log('⚠️ WARNING: Disk usage above 80%');
// Логирование предупреждения
logWarning('disk_warning', usage);
} else {
console.log('✅ Disk usage normal');
}
} catch (error) {
console.log('❌ Failed to check disk space');
}
}
Пример 2: Условный деплой в зависимости от окружения
const environment = process.env.NODE_ENV || 'development';
const deployConfig = {
development: {
host: 'localhost',
port: 3000,
ssl: false
},
staging: {
host: 'staging.example.com',
port: 443,
ssl: true
},
production: {
host: 'api.example.com',
port: 443,
ssl: true
}
};
function deploy() {
const config = deployConfig[environment];
if (!config) {
console.error('Unknown environment:', environment);
process.exit(1);
}
// Условная логика для SSL
if (config.ssl) {
console.log('🔐 Configuring SSL certificates');
// Настройка SSL
}
// Условная логика для порта
const portConfig = config.port === 443 ? '--ssl' : `--port ${config.port}`;
console.log(`🚀 Deploying to ${config.host}:${config.port}`);
}
Сравнение различных подходов
Подход | Читаемость | Производительность | Когда использовать |
---|---|---|---|
if…else | Высокая | Хорошая | Сложные условия, несколько проверок |
Тернарный оператор | Средняя | Отличная | Простые условия, присваивание значений |
switch | Высокая | Отличная | Множественные значения одной переменной |
Логические операторы | Низкая | Отличная | Короткие проверки, значения по умолчанию |
Продвинутые техники и хитрости
Использование логических операторов для условий
// Короткое замыкание для значений по умолчанию
const serverPort = process.env.PORT || 3000;
// Условное выполнение
isProduction && console.log('Production mode enabled');
// Nullish coalescing (ES2020)
const config = userConfig ?? defaultConfig;
// Optional chaining для безопасных проверок
const apiKey = config?.api?.key ?? 'default-key';
Объектные условия для сложной логики
const serverActions = {
start: () => console.log('Starting server...'),
stop: () => console.log('Stopping server...'),
restart: () => console.log('Restarting server...'),
status: () => console.log('Checking status...')
};
const action = process.argv[2];
const executeAction = serverActions[action] || (() => console.log('Unknown action'));
executeAction();
Автоматизация и скрипты
Условные операторы открывают огромные возможности для автоматизации серверных задач. Вот пример скрипта для автоматического бэкапа:
#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
const BACKUP_DIR = '/var/backups';
const MAX_BACKUPS = 7;
function performBackup() {
const timestamp = new Date().toISOString().split('T')[0];
const backupPath = path.join(BACKUP_DIR, `backup-${timestamp}.tar.gz`);
// Проверка свободного места
const freeSpace = execSync('df -BG /var | tail -1 | awk \'{print $4}\'').toString().trim();
const freeSpaceGB = parseInt(freeSpace);
if (freeSpaceGB < 10) {
console.log('⚠️ Low disk space, cleaning old backups');
cleanOldBackups();
}
// Проверка существования директории
if (!fs.existsSync(BACKUP_DIR)) {
fs.mkdirSync(BACKUP_DIR, { recursive: true });
}
// Условное выполнение бэкапа
try {
const command = `tar -czf ${backupPath} /var/www/html`;
execSync(command);
console.log(`✅ Backup created: ${backupPath}`);
} catch (error) {
console.log('❌ Backup failed:', error.message);
}
}
function cleanOldBackups() {
const backups = fs.readdirSync(BACKUP_DIR)
.filter(file => file.startsWith('backup-'))
.sort()
.reverse();
if (backups.length > MAX_BACKUPS) {
const toDelete = backups.slice(MAX_BACKUPS);
toDelete.forEach(backup => {
const filePath = path.join(BACKUP_DIR, backup);
fs.unlinkSync(filePath);
console.log(`🗑️ Removed old backup: ${backup}`);
});
}
}
performBackup();
Интеграция с другими инструментами
JavaScript отлично работает с системными утилитами и может быть интегрирован в различные пайплайны. Например, для работы с Docker:
const { execSync } = require('child_process');
function manageContainer(action, containerName) {
const containerExists = () => {
try {
execSync(`docker ps -a -q -f name=${containerName}`);
return true;
} catch {
return false;
}
};
const containerRunning = () => {
try {
const output = execSync(`docker ps -q -f name=${containerName}`).toString();
return output.trim().length > 0;
} catch {
return false;
}
};
switch (action) {
case 'start':
if (containerExists()) {
if (!containerRunning()) {
execSync(`docker start ${containerName}`);
console.log(`✅ Container ${containerName} started`);
} else {
console.log(`ℹ️ Container ${containerName} already running`);
}
} else {
console.log(`❌ Container ${containerName} does not exist`);
}
break;
case 'stop':
if (containerRunning()) {
execSync(`docker stop ${containerName}`);
console.log(`🛑 Container ${containerName} stopped`);
} else {
console.log(`ℹ️ Container ${containerName} not running`);
}
break;
}
}
Для тестирования и разработки подобных скриптов рекомендую использовать VPS или выделенный сервер, где можно безопасно экспериментировать с различными конфигурациями.
Полезные ресурсы и документация
Для углубленного изучения рекомендую следующие ресурсы:
Заключение и рекомендации
Условные операторы в JavaScript — это фундаментальный инструмент для создания умных скриптов и автоматизации серверных задач. Правильное использование различных подходов позволяет создавать читаемый, производительный и надёжный код.
Основные рекомендации:
- Используй
if...else
для сложной логики с несколькими условиями - Применяй тернарный оператор для простых условий и присваивания значений
- Выбирай
switch
для множественных проверок одной переменной - Не забывай про логические операторы для коротких проверок
- Всегда обрабатывай ошибки в условиях, особенно при работе с внешними командами
Помни, что хорошие условные операторы — это не только про логику, но и про читаемость кода. Твои будущие коллеги (и ты сам через полгода) скажут спасибо за понятный и структурированный код. Особенно это важно в DevOps-скриптах, где ошибка может стоить дорого.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.