Строки — один из самых используемых типов в JavaScript, и они поставляются с богатым набором встроенных методов. Знание этих методов заменяет множество ручных циклов.
`length` — это свойство, не метод, поэтому скобки не нужны:
```javascript
let name = "JavaScript";
console.log(name.length); // 10
```
Смена регистра: `toUpperCase()` и `toLowerCase()` возвращают новую строку, не изменяя оригинал. Строки в JavaScript неизменяемы — каждый метод возвращает новое значение, не мутирует строку на месте.
Удаление пробелов: `trim()` убирает пробелы, табуляцию и переносы строк с обоих концов. `trimStart()` и `trimEnd()` обрабатывают только одну сторону. Это важно при обработке пользовательского ввода, который часто приходит со случайными пробелами.
Поиск внутри строки:
- `includes(sub)` — возвращает true если подстрока есть где-либо
- `startsWith(sub)` и `endsWith(sub)` — проверяют только начало или конец
- `indexOf(sub)` — возвращает позицию (с нуля), или -1 если не найдено
- `lastIndexOf(sub)` — то же, но сканирует справа налево
Изменение содержимого:
- `replace(old, new)` — заменяет только первое совпадение
- `replaceAll(old, new)` — заменяет каждое совпадение
- `split(separator)` — превращает строку в массив частей
Две частые ошибки:
`replace()` затрагивает только первое вхождение. Для всех — `replaceAll()` или regex с флагом `g`: `replace(/word/g, 'replacement')`.
`indexOf()` возвращает -1 когда ничего не найдено — не null и не false. Всегда сравнивай явно: `if (idx !== -1)`, а не просто `if (idx)`. Результат 0 (подстрока на позиции 0) является falsy и будет ошибочно расценен как "не найдено".
Ни один из этих методов не изменяет оригинальную строку. Результат нужно сохранять: `let clean = text.trim()`, а не просто `text.trim()`.
slice, padStart, шаблонные строки и цепочки методов
Эти четыре паттерна постоянно встречаются в реальном коде и покрывают большинство задач по обработке строк.
**Извлечение частей через `slice`**
```javascript
let filename = "report_2024.pdf";
let ext = filename.slice(filename.lastIndexOf(".")); // ".pdf"
let name = filename.slice(0, filename.lastIndexOf(".")); // "report_2024"
```
`slice(start, end)` использует индексы от нуля и не включает конечную позицию. Отрицательные значения считаются с конца: `slice(-3)` берёт последние 3 символа. Комбинация `slice` с `lastIndexOf` — стандартный паттерн для разбиения имён файлов или URL по известному разделителю.
**Дополнение для вывода фиксированной ширины**
```javascript
let orderNum = 42;
console.log(String(orderNum).padStart(6, "0")); // "000042"
let label = "ok";
console.log(label.padEnd(10, ".")); // "ok........"
```
`padStart(targetLength, padChar)` заполняет левую сторону; `padEnd` — правую. Число нужно сначала конвертировать в строку — `padStart` работает только со строками. Полезно для номеров заказов, временных меток и выравнивания табличного вывода.
**Шаблонные строки**
```javascript
let user = "Alice";
let score = 98;
console.log(`${user} scored ${score} points`);
console.log(`Grade: ${score >= 90 ? "A" : "B"}`);
```
Шаблонные строки используют обратные кавычки, а не обычные. Всё внутри `${}` вычисляется как выражение JavaScript — можно вызывать функции, использовать тернарные операторы, делать арифметику. Используй их когда нужно вставить переменную в строку; конкатенация через `+` быстро становится неудобной.
**Цепочки методов**
```javascript
let raw = " Hello, World! ";
let result = raw.trim().toLowerCase().replaceAll(",", "");
// "hello world!"
```
Каждый метод строки возвращает новую строку, поэтому вызовы можно объединить в одну строку. Читай слева направо: сначала trim, потом нижний регистр, потом удаление знаков препинания. Цепочка уместна когда каждый шаг понятен — если логика запутывается, лучше разбить на отдельные переменные.
Быстрый справочник методов строк JavaScript. Все возвращают новую строку, если не указано иное.
**Проверка**
`str.length` — количество символов (свойство, без скобок)
`str.includes(sub)` — true если sub есть где-либо
`str.startsWith(sub)` — true если str начинается с sub
`str.endsWith(sub)` — true если str заканчивается на sub
`str.indexOf(sub)` — первая позиция sub, или -1
`str.lastIndexOf(sub)` — последняя позиция sub, или -1
**Преобразование**
`str.toUpperCase()` — весь верхний регистр
`str.toLowerCase()` — весь нижний регистр
`str.trim()` — удалить пробелы с обоих концов
`str.trimStart()` — удалить только слева
`str.trimEnd()` — удалить только справа
`str.replace(old, new)` — заменить первое совпадение
`str.replaceAll(old, new)` — заменить все совпадения
`str.padStart(len, char)` — дополнить слева до длины len
`str.padEnd(len, char)` — дополнить справа до длины len
`str.repeat(n)` — повторить строку n раз
**Извлечение**
`str.slice(start, end)` — подстрока по индексу; end не включается; отрицательные — с конца
`str.split(sep)` — разбить на массив по разделителю; `split('')` — на отдельные символы
**Шаблонные строки**
`` `Hello, ${name}!` `` — вставить любое выражение через ${}
`` `${a > b ? a : b}` `` — тернарные операторы, вызовы функций, арифметика — всё работает в ${}
Найди позицию первого вхождения `"script"` (без учёта регистра) в `text`.
Если не найдено — выведи `"Not found"`, иначе — индекс.
let text = "JavaScript is a scripting language";
// твой код здесь
Решение
let text = "JavaScript is a scripting language";
let idx = text.toLowerCase().indexOf("script");
if (idx !== -1) {
console.log(idx);
} else {
console.log("Not found");
}
Переменная `path` хранит путь к файлу.
Извлеки только имя файла без расширения (часть после последнего `"/"` и до последнего `"."`).
let path = "files/reports/summary_2024.pdf";
// твой код здесь
Решение
let path = "files/reports/summary_2024.pdf";
let filename = path.slice(path.lastIndexOf("/") + 1);
let name = filename.slice(0, filename.lastIndexOf("."));
console.log(name);
Переменная `input` хранит сырой ввод с лишними пробелами, смешанным регистром и дефисами вместо пробелов.
Нормализуй его: удали пробелы по краям, переведи в нижний регистр, замени все дефисы на пробелы.
let input = " Hello-World-JavaScript ";
// твой код здесь
Решение
let input = " Hello-World-JavaScript ";
console.log(input.trim().toLowerCase().replaceAll("-", " "));
No split tab
Настройки cookies
Мы используем необходимые cookies для работы сайта. С вашего разрешения мы также можем сохранять настройки сайта и использовать аналитические и рекламные cookies, чтобы понимать использование сайта и поддерживать развитие проекта.
* Вы всегда можете изменить свой выбор в настройках сайта.
Выберите категории cookies
Настройки аналитики
Можно отключить аналитику использования платформы. Также можно отправить в Google Analytics запрос на удаление данных об использовании этого сайта, связанных с этим браузером.
Учебный workspace
Учитесь, читая, запуская код и решая задачи.
Практикуйте программирование с пояснениями тем, упражнениями, инструментами browser IDE, проверкой regex и тренировкой печати кода в одном workspace.
Открывайте инструменты во вкладках.Упражнения, IDE-инструменты и тренажеры остаются доступными как вкладки сайта.
Переключайтесь без потери контекста.Переходите между пояснениями, кодом и утилитами, сохраняя свое место.
Используйте sidebar как карту.Левые панели содержат навигацию, настройки, файлы, libraries и управление инструментами.
PythonJavaScriptSQLite
Одна IDE, три практичных режима
Python в браузере.Запускайте небольшие скрипты, пробуйте библиотеки и тренируйте API-запросы без установки.
JavaScript для быстрых экспериментов.Проверяйте код для браузера и сравнивайте идеи рядом с учебными материалами.
SQLite для практики с данными.Открывайте обозреватель базы данных, изучайте таблицы, пишите запросы и учитесь SQL локально.
ТемаIDE
Работайте рядом в split tabs
Держите инструкции перед глазами.Откройте упражнение или справочную страницу рядом с IDE, вместо постоянных переключений.
Сравнивайте инструменты во время обучения.Размещайте проверки regex, пояснения и эксперименты с кодом рядом, когда это нужно для задачи.
Закройте split, когда закончите.Workspace вернётся к одной сфокусированной вкладке, а открытые вкладки сайта останутся доступны.
Тренажер слепой печати кода
Или просто текста
Тренажер рассчитан на физическую клавиатуру.Откройте этот раздел на ноутбуке или компьютере с широким экраном. На телефоне тренировка слепой печати не будет корректной.
Скорость: 0 зн/мин
0 слов/мин
Лучшая скорость (60с): 0 зн/мин
0 слов/мин
Ошибки: 0
Общее время: 0.0 с
Для активации режима слепого набора не подсматривайте на физическую клавиатуру.