Часть строки и поиск
В прошлых уроках строка была табличкой с буквами в пронумерованных клеточках. Табличку нельзя переписать, но с неё можно снять копию. Методы строк работают как копировальный аппарат: каждый из них делает по старой табличке новую, а исходная остаётся прежней.
С текстом чаще всего делают две вещи: берут из него кусок или ищут в нём нужное слово. Код города из номера телефона, имя файла без расширения, проверка, есть ли в адресе знак @, — всё это такие задачи. Давайте посмотрим на обе на строке "hello world":
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— стоит ли она в конце.
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Разберём вывод по строкам:
"world"начинается с индекса6, а первая из трёх буквlстоит на индексе2."lo w"есть внутри строки, пробел тоже считается, а"hell"— её начало.endsWith("World")даётfalse, хотя строка кончается наworld.
Поиск различает регистр — заглавные и строчные буквы. Поэтому "World" в строке "hello world" не нашлась.
Частая ошибка
Результат indexOf проверили в if как ответ «есть или нет»:
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 и подпишись на канал — откроются все уроки.