Перейти к содержимому
Теория · Строки · урок 5 из 12

Часть строки и поиск

В прошлых уроках строка была табличкой с буквами в пронумерованных клеточках. Табличку нельзя переписать, но с неё можно снять копию. Методы строк работают как копировальный аппарат: каждый из них делает по старой табличке новую, а исходная остаётся прежней.

С текстом чаще всего делают две вещи: берут из него кусок или ищут в нём нужное слово. Код города из номера телефона, имя файла без расширения, проверка, есть ли в адресе знак @, — всё это такие задачи. Давайте посмотрим на обе на строке "hello world":

JavaScript
const text = "hello world";

console.log(text.slice(0, 5)); // hello
console.log(text.slice(6)); // world
console.log(text.slice(-3)); // rld
console.log(text.indexOf("o"), text.indexOf("z")); // 4 -1
console.log(text); // hello world

Последняя строка печатает hello world: ни один вызов не изменил text.

Здесь аналогия с копиром неточна: indexOf не делает новую табличку, а отвечает числом — индексом.

Часть строки

Часть строки называют подстрокой. Метод slice(start, end) возвращает подстроку от индекса start до индекса end, причём символ с индексом end в неё не входит. Поэтому text.slice(0, 5) — это пять символов с индексами от 0 до 4.

Удобно представить ножницы: они режут табличку перед клеточкой start и перед клеточкой end. Всё, что между разрезами, и есть подстрока. Длина куска равна end - start: у slice(0, 5) это 5.

У slice есть ещё три правила:

  • без второго аргумента slice берёт всё до конца строки: text.slice(6) даёт "world";
  • отрицательный индекс отсчитывается от конца, и slice(-3) возвращает три последних символа;
  • за границы строки slice не выходит и ошибки не вызывает: "cat".slice(1, 100) даёт "at".

Поиск

Искать подстроку можно двумя способами:

  • узнать, где она стоит;
  • узнать только, есть ли она.

Где стоит: indexOf

Метод indexOf возвращает индекс первого вхождения подстроки. Для подстроки из нескольких символов это индекс её первого символа: "world" начинается с индекса 6.

Если подстроки в строке нет, indexOf возвращает -1. Клеточки с номером -1 у таблички не бывает, поэтому такой ответ нельзя спутать с настоящим индексом.

Есть ли: includes, startsWith, endsWith

Эти три метода отвечают значением boolean:

  • includes — есть ли подстрока где-нибудь;
  • startsWith — стоит ли она в начале;
  • endsWith — стоит ли она в конце.
JavaScript
console.log(text.indexOf("world"), text.indexOf("l")); // 6 2
console.log(text.includes("lo w"), text.startsWith("hell")); // true true
console.log(text.endsWith("World")); // false

Разберём вывод по строкам:

  1. "world" начинается с индекса 6, а первая из трёх букв l стоит на индексе 2.
  2. "lo w" есть внутри строки, пробел тоже считается, а "hell" — её начало.
  3. endsWith("World") даёт false, хотя строка кончается на world.

Поиск различает регистр — заглавные и строчные буквы. Поэтому "World" в строке "hello world" не нашлась.

Частая ошибка

Результат indexOf проверили в if как ответ «есть или нет»:

JavaScript
const greeting = "hello";
if (greeting.indexOf("h")) { // ✗
    console.log("found");
}

Программа ничего не печатает, хотя буква h в строке есть. Она стоит на индексе 0, а 0 — ложное значение, и условие не выполняется. Если бы подстроки не было, indexOf вернул бы -1, а это истинное значение. Для ответа «есть или нет» служит includes: greeting.includes("h") даёт true.

Главное

  • Методы строк не меняют исходную строку, а возвращают новое значение.
  • slice(start, end) возвращает подстроку без символа с индексом end, а отрицательный индекс считается от конца.
  • indexOf возвращает индекс первого вхождения или -1, а includes, startsWith и endsWith отвечают true или false.
  • Для вопроса «есть или нет» берите includes, а не indexOf в if.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом