Avatar ·

Как сделать первую букву строки заглавной в JavaScript?

Всем привет! Я только начал изучать JavaScript и столкнулся с такой задачей: нужно написать функцию, которая принимает строку и возвращает её с первой заглавной буквой. Например, из "hello world" должно получиться "Hello world". Я попробовал сделать это через charAt и toUpperCase, но у меня ничего не работает как надо. Вот мой код: ```javascript function capitalizeFirstLetter(str) { return str.charAt(0).toUpperCase(); } console.log(capitalizeFirstLetter("hello")); // Выводит только "H", а нужно "Hello" ``` Проблема в том, что функция возвращает только одну букву, а не всю строку. Я понимаю, что нужно как-то сохранить остальные символы, но не знаю, как это сделать правильно. Пробовал использовать slice, но запутался. Также я заметил, что если строка пустая, то код выдаёт ошибку. Как это обработать? И что делать, если строка уже начинается с заглавной буквы или содержит пробелы в начале? Подскажите, пожалуйста, самое простое и надёжное решение для новичка. Желательно с пояснением каждого шага, чтобы я понял логику, а не просто скопировал код. Заранее спасибо! <<>>

Правильный способ: комбинация charAt, toUpperCase и slice

Ваша интуиция верна — нужно работать с первым символом отдельно, а затем соединить его с остальной частью строки. Давайте разберём решение по шагам.

Основная идея:

  • Извлечь первый символ — str[0] или str.charAt(0)
  • Сделать его заглавным — .toUpperCase()
  • Взять остальную часть строки — str.slice(1)
  • Соединить через конкатенацию или шаблонные строки

Вот рабочий код с пояснениями:

function capitalizeFirstLetter(str) {
  // 1. Проверяем, что строка не пустая
  if (!str) return '';
  
  // 2. Берём первый символ и делаем его заглавным
  const firstChar = str[0].toUpperCase();
  
  // 3. Берём остальную часть строки (с 1-го индекса до конца)
  const rest = str.slice(1);
  
  // 4. Соединяем результат
  return firstChar + rest;
}

// Тесты
console.log(capitalizeFirstLetter("hello"));      // "Hello"
console.log(capitalizeFirstLetter("world"));      // "World"
console.log(capitalizeFirstLetter(""));           // ""
console.log(capitalizeFirstLetter("JavaScript")); // "JavaScript" (уже заглавная)

Разбор важных моментов

1. Почему str[0], а не charAt(0)?
Оба варианта работают, но str[0] короче и современнее. charAt(0) — это старый метод, который нужен был для обратной совместимости со старыми браузерами. Сейчас можно смело использовать квадратные скобки.

2. Зачем нужен slice(1)?
Метод slice(start, end) возвращает часть строки. slice(1) означает "взять символы начиная с индекса 1 и до конца". Если строка "hello", то slice(1) вернёт "ello". Если строка состоит из одного символа "H", то slice(1) вернёт пустую строку, что тоже корректно.

3. Обработка пустой строки
Без проверки if (!str) код упадёт с ошибкой, потому что у пустой строки нет первого символа. Проверка if (!str) сработает для null, undefined и пустой строки.

4. Что будет, если строка уже с заглавной?
Ничего страшного — toUpperCase() на уже заглавной букве просто вернёт её же. Функция остаётся корректной.

Сокращённый вариант (одной строкой)

Для опытных разработчиков можно записать компактнее:

const capitalize = str => str ? str[0].toUpperCase() + str.slice(1) : '';

Работа с предложениями (каждое слово)

Если нужно сделать заглавной первую букву каждого слова (title case), используйте комбинацию split и map:

function capitalizeWords(str) {
  return str
    .split(' ')
    .map(word => word ? word[0].toUpperCase() + word.slice(1) : '')
    .join(' ');
}

console.log(capitalizeWords("hello world")); // "Hello World"

Важные замечания

  • Метод toUpperCase() корректно работает с буквами не только английского, но и русского алфавита: "привет" → "Привет"
  • Если строка начинается с пробела, то str[0] будет пробелом, и функция сделает заглавным именно пробел (что не имеет смысла). Для таких случаев нужно предварительно удалять пробелы через str.trim()
  • Метод slice не изменяет исходную строку — строки в JavaScript неизменяемы (immutable)

Это самое простое и надёжное решение. Понимание этих базовых операций со строками — важный шаг в освоении JavaScript.

<<>>

Альтернативный подход: через replace с регулярным выражением

Можно использовать метод replace вместе с регулярным выражением, которое находит первый символ строки:

function capitalizeFirstLetter(str) {
  return str.replace(/^./, char => char.toUpperCase());
}

// Тесты
console.log(capitalizeFirstLetter("hello")); // "Hello"
console.log(capitalizeFirstLetter(""));      // "" (без ошибки)

Как это работает:

  • /^./ — регулярное выражение: ^ означает начало строки, . — любой одиночный символ
  • Второй аргумент — стрелочная функция, которая получает найденный символ и возвращает его заглавную версию
  • Если строка пустая, replace просто ничего не заменяет и возвращает пустую строку — проверка не нужна

Плюсы и минусы

Плюсы:

  • Короткая запись без явной проверки на пустую строку
  • Элегантное решение для тех, кто знаком с регулярными выражениями

Минусы:

  • Регулярные выражения могут быть сложны для новичков
  • Производительность чуть ниже, чем у прямого доступа через str[0] + slice
  • Неочевидное поведение для строк, начинающихся с пробела — пробел станет заглавным

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