Урок · JavaScript
Строки: работаем с текстом
Строка в JavaScript — последовательность символов в кавычках: 'Привет', "Привет" или `Привет`. Строки нельзя изменить по месту: методы trim, toLowerCase, replace и другие возвращают новую строку. Шаблонные строки в обратных кавычках позволяют вставлять переменные через ${…}.
`Привет, ${name}!`— шаблонная строка с подстановкой.str.length— длина,str[0]илиstr.at(-1)— символ.- Методы не меняют строку, а возвращают новую — результат нужно сохранить.
- Значение поля формы — всегда строка; число получают через
Number(). - Перед поиском и сравнением:
trim()и приведение к одному регистру.
Зачем этот урок сейчас
Почти всё, что человек вводит на странице, — строки: имя, почта, поисковый запрос, сообщение. Их нужно очищать от лишних пробелов, проверять, искать в них, собирать из частей текст для вывода. Строковые методы — ежедневный инструмент в любом интерфейсе.
Создание и шаблонные строки
const a = 'Одинарные кавычки';
const b = "Двойные кавычки";
const name = 'Анна';
const count = 3;
const message = `Привет, ${name}! У тебя ${count} новых урока.`;
const multiline = `Первая строка
Вторая строка`;Одинарные и двойные кавычки работают одинаково — выбери одни и пиши везде так. Обратные кавычки создают шаблонную строку: внутрь ${…} можно вставить переменную или выражение, а переносы строк сохраняются. Склеивать через + тоже можно, но шаблон читается проще.
Длина и символы
const word = 'JavaScript';
word.length; // 10
word[0]; // 'J'
word.at(-1); // 't' — последний
word[100]; // undefinedИндексы начинаются с нуля. Строку нельзя изменить по символу: word[0] = 'j' молча ничего не сделает. Чтобы изменить, создай новую строку.
Эмодзи и некоторые редкие символы занимают две позиции: '👍'.length равно 2. Для подсчёта видимых символов используй [...str].length.
Методы возвращают новую строку
let title = ' Flexbox ';
title.trim(); // результат потерян
console.log(title); // ' Flexbox ' — не изменилась
title = title.trim(); // сохранили результат
console.log(title); // 'Flexbox'Это главная ловушка: метод вызван, а строка прежняя. Результат обязательно сохраняй в переменную — новую или ту же самую, объявленную через let.
Основные методы строк
| Метод | Что делает | Пример → результат |
|---|---|---|
trim() | убирает пробелы по краям | ' a '.trim() → 'a' |
toLowerCase(), toUpperCase() | меняет регистр | 'CSS'.toLowerCase() → 'css' |
includes(s) | есть ли подстрока | 'mail@x.ru'.includes('@') → true |
startsWith, endsWith | начинается / заканчивается | 'img.png'.endsWith('.png') → true |
indexOf(s) | позиция подстроки или −1 | 'hello'.indexOf('l') → 2 |
slice(start, end) | часть строки, конец не входит | 'JavaScript'.slice(0, 4) → 'Java' |
split(sep) | разрезает в массив | 'a,b'.split(',') → ['a', 'b'] |
replace, replaceAll | замена первого / всех вхождений | 'a-b-c'.replaceAll('-', ' ') → 'a b c' |
padStart(n, s) | дополняет слева до длины | '5'.padStart(2, '0') → '05' |
repeat(n) | повторяет строку | 'ab'.repeat(3) → 'ababab' |
Поиск без учёта регистра
function matches(text, query) {
return text.toLocaleLowerCase('ru').includes(query.trim().toLocaleLowerCase('ru'));
}
matches('Основы JavaScript', ' java '); // trueСравнение строк чувствительно к регистру и пробелам: 'Java' === 'java' ложно. Перед поиском очищай запрос через trim и приводи обе строки к одному регистру. toLocaleLowerCase('ru') корректнее обрабатывает буквы конкретного языка.
split и join
const tags = 'html, css, js'.split(', '); // ['html', 'css', 'js']
const slug = 'Основы HTML'.toLowerCase().split(' ').join('-'); // 'основы-html'
const words = text.trim().split(/\s+/); // по любым пробеламsplit превращает строку в массив, join собирает массив обратно в строку. Между ними удобно применять методы массивов: отфильтровать, отсортировать, преобразовать.
Строки и числа
const value = '25'; // из поля формы
value + 5; // '255' — склейка строк!
Number(value) + 5; // 30
Number(''); // 0 — осторожно с пустым полем
Number('12px'); // NaN
parseInt('12px', 10); // 12
String(42); // '42'
(1234.5).toFixed(1); // '1234.5'Значение поля формы — всегда строка, даже если человек ввёл цифры. Оператор + со строкой склеивает, а не складывает. Преобразуй явно через Number() и проверяй пустую строку отдельно: Number('') даёт 0, а не ошибку.
Сравнение и сортировка
'ёж' < 'яблоко'; // false — хотя по алфавиту «ё» раньше «я»
'ёж'.localeCompare('яблоко', 'ru'); // -1 — правильно: «ёж» раньше
['ёж', 'арбуз', 'Банан'].sort((a, b) => a.localeCompare(b, 'ru'));Операторы < и > сравнивают строки по кодам символов, поэтому «ё» и заглавные буквы встают не на свои места. Для алфавитного порядка используй localeCompare с языком.
Шаблонная строка или склейка
Переменные внутри текста, переносы строк, читается как обычная фраза.
Работает везде, но с несколькими переменными легко потерять пробел или кавычку.
Частые ошибки
- Вызывают
trim()и не сохраняют результат. - Складывают число со строкой из поля и получают склейку «255».
- Ищут без приведения к одному регистру: «Java» не находит «java».
- Сортируют русские слова без
localeCompare. - Вставляют текст пользователя на страницу через innerHTML вместо textContent.
Доступность
Строки, которые видит человек, держи короткими и понятными. Для чисел, дат и цен используй Intl.NumberFormat и Intl.DateTimeFormat — так «1 800 ₽» и «24 октября» будут записаны по правилам языка, и скринридер прочитает их правильно. Сообщения об ошибках пиши текстом, объясняющим, что исправить.
Поддержка браузерами
Методы trim, includes, startsWith, slice, split, padStart, repeat и шаблонные строки работают во всех актуальных браузерах. replaceAll и at — более новые, но тоже поддерживаются современными версиями.
Практика
Напиши функцию normalizeEmail(value), которая убирает пробелы и приводит почту к нижнему регистру, и функцию preview(text, limit = 60), которая обрезает длинный текст до limit символов и добавляет многоточие, а короткий возвращает как есть. Лишние пробелы внутри текста схлопни в один.
Показать решение
function normalizeEmail(value) {
return value.trim().toLowerCase();
}
function preview(text, limit = 60) {
const clean = text.trim().replace(/\s+/g, ' ');
if (clean.length <= limit) return clean;
return clean.slice(0, limit).trimEnd() + '…';
}
normalizeEmail(' Anna@Mail.RU '); // 'anna@mail.ru'Частые вопросы
Почему trim() не убрал пробелы?
Методы строк не меняют исходную строку, а возвращают новую. Сохрани результат: str = str.trim().
Чем отличаются одинарные, двойные и обратные кавычки?
Одинарные и двойные равнозначны. Обратные создают шаблонную строку с подстановкой ${…} и переносами строк.
Почему '25' + 5 даёт '255'?
Если один из операндов строка, + склеивает строки. Преобразуй значение через Number('25').
Как сравнить строки без учёта регистра?
Приведи обе к одному регистру: a.toLowerCase() === b.toLowerCase(), или используй localeCompare с опцией sensitivity.
Как проверить, что строка не пустая?
str.trim() !== '' или str.trim().length > 0 — trim нужен, чтобы строка из одних пробелов тоже считалась пустой.