Home » Как писать условные операторы в JavaScript
Как писать условные операторы в JavaScript

Как писать условные операторы в 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-скриптах, где ошибка может стоить дорого.


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

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

Leave a reply

Your email address will not be published. Required fields are marked