Строковые методы JS
Строки
В JavaScript любые текстовые данные являются строками. Не существует отдельного типа «символ», который есть в ряде других языков.
Кавычки
В JavaScript есть разные типы кавычек.
Строку можно создать с помощью одинарных, двойных либо обратных кавычек:
Одинарные и двойные кавычки работают, по сути, одинаково, а если использовать обратные кавычки, то в такую строку мы сможем вставлять произвольные выражения, обернув их в ${…}:
Ещё одно преимущество обратных кавычек — они могут занимать более одной строки, вот так:
Выглядит вполне естественно, не правда ли? Что тут такого? Но если попытаться использовать точно так же одинарные или двойные кавычки, то будет ошибка:
Одинарные и двойные кавычки в языке с незапамятных времён: тогда потребность в многострочных строках не учитывалась. Что касается обратных кавычек, они появились существенно позже, и поэтому они гибче.
Обратные кавычки также позволяют задавать «шаблонную функцию» перед первой обратной кавычкой. Используемый синтаксис: funcstring
. Автоматически вызываемая функция func получает строку и встроенные в неё выражения и может их обработать. Если перед строкой есть выражение, то шаблонная строка называется «теговым шаблоном». Это позволяет использовать свою шаблонизацию для строк, но на практике теговые шаблоны применяются редко.
Спецсимволы
Многострочные строки также можно создавать с помощью одинарных и двойных кавычек, используя так называемый «символ перевода строки», который записывается как \n:
В частности, эти две строки эквивалентны, просто записаны по-разному:
Все спецсимволы начинаются с обратного слеша, \ — так называемого «символа экранирования».
Он также используется, если необходимо вставить в строку кавычку.
К примеру:
Здесь перед входящей в строку кавычкой необходимо добавить обратный слеш — \' — иначе она бы обозначала окончание строки.
Разумеется, требование экранировать относится только к таким же кавычкам, как те, в которые заключена строка. Так что мы можем применить и более элегантное решение, использовав для этой строки двойные или обратные кавычки:
Заметим, что обратный слеш \ служит лишь для корректного прочтения строки интерпретатором, но он не записывается в строку после её прочтения. Когда строка сохраняется в оперативную память, в неё не добавляется символ . Вы можете явно видеть это в выводах alert в примерах выше.
Но что, если нам надо добавить в строку собственно сам обратный слеш \?
Это можно сделать, добавив перед ним… ещё один обратный слеш!
Длина строки
Свойство length
содержит длину строки:
Обратите внимание, \n — это один спецсимвол, поэтому тут всё правильно: длина строки 3
length — это свойство
Бывает так, что люди с практикой в других языках случайно пытаются вызвать его, добавляя круглые скобки: они пишут str.length()
вместо str.length.
Это не работает.
Так как str.length
— это числовое свойство, а не функция, добавлять скобки не нужно.
Доступ к символам
Метод charAt( )
Получить символ, который занимает позицию pos, можно с помощью квадратных скобок: [pos]. Также можно использовать метод charAt: str.charAt(pos)
. Первый символ занимает нулевую позицию:
Квадратные скобки — современный способ получить символ, в то время как charAt существует в основном по историческим причинам.
Разница только в том, что если символ с такой позицией отсутствует, тогда [ ] вернёт undefined, а charAt — пустую строку:
Также можно перебрать строку посимвольно, используя for..of:
Строки неизменяемы
Содержимое строки в JavaScript нельзя изменить. Нельзя взять символ посередине и заменить его. Как только строка создана — она такая навсегда.
Давайте попробуем так сделать, и убедимся, что это не работает:
Можно создать новую строку и записать её в ту же самую переменную вместо старой.
Например:
В последующих разделах мы увидим больше примеров.
Изменение регистра
Методы toLowerCase( ) и toUpperCase( )
Методы toLowerCase( )
и toUpperCase( )
меняют регистр символов:
Если мы захотим перевести в нижний регистр какой-то конкретный символ:
Поиск подстроки
Метод indexOf( )
Существует несколько способов поиска подстроки.
str.indexOf
Первый метод — str.indexOf(substr, pos).
Он ищет подстроку substr
в строке str
, начиная с позиции pos
, и возвращает позицию, на которой располагается совпадение, либо -1 при отсутствии совпадений.
Например:
Необязательный второй аргумент позволяет начать поиск с определённой позиции.
Например, первое вхождение "id"
— на позиции 1
. Для того, чтобы найти следующее, начнём поиск с позиции 2
:
Чтобы найти все вхождения подстроки, нужно запустить indexOf
в цикле. Каждый раз, получив очередную позицию, начинаем новый поиск со следующей:
Тот же алгоритм можно записать и короче:
str.lastIndexOf(substr, position)
Также есть похожий метод str.lastIndexOf(substr, position)
, который ищет с конца строки к её началу.
Он используется тогда, когда нужно получить самое последнее вхождение: перед концом строки или начинающееся до (включительно) определённой позиции.
При проверке indexOf
в условии if
есть небольшое неудобство. Такое условие не будет работать:
Мы ищем подстроку "Widget"
, и она здесь есть, прямо на позиции 0
. Но alert
не показывается, т. к. str.indexOf("Widget")
возвращает 0
, и if
решает, что тест не пройден.
Поэтому надо делать проверку на -1
:
Метод includes()
Более современный метод str.includes(substr, pos)
возвращает true
, если в строке str
есть подстрока substr
, либо false
, если нет.
Это — правильный выбор, если нам необходимо проверить, есть ли совпадение, но позиция не нужна:
Необязательный второй аргумент str.includes
позволяет начать поиск с определённой позиции:
Получение подстроки
Метод Slice( )
В JavaScript есть 3 метода для получения подстроки: substring
, substr
и slice
.
str.slice(start [, end])
Возвращает часть строки от start
до (не включая) end
.
Например:
Если аргумент end
отсутствует, slice
возвращает символы до конца строки:
Также для start/end
можно задавать отрицательные значения. Это означает, что позиция определена как заданное количество символов с конца строки:
str.substring(start [, end])
Возвращает часть строки между start
и end
.
Это — почти то же, что и slice
, но можно задавать start
больше end
.
Например:
Отрицательные значения substring
, в отличие от slice
, не поддерживает, они интерпретируются как 0.
str.substr(start [, length])
Возвращает часть строки от start
длины length
.
В противоположность предыдущим методам, этот позволяет указать длину вместо конечной позиции:
Значение первого аргумента может быть отрицательным, тогда позиция определяется с конца:
Какой метод выбрать ?
Все эти методы эффективно выполняют задачу. Формально у метода substr есть небольшой недостаток: он описан не в собственно спецификации JavaScript, а в приложении к ней — Annex B. Это приложение описывает возможности языка для использования в браузерах, существующие в основном по историческим причинам. Таким образом, в другом окружении, отличном от браузера, он может не поддерживаться. Однако на практике он работает везде.
Из двух других вариантов, slice более гибок, он поддерживает отрицательные аргументы, и его короче писать. Так что, в принципе, можно запомнить только его.
Метод trim( )
Метод trim()
удаляет пробельные символы с начала и конца строки. Пробельными символами в этом контексте считаются все собственно пробельные символы (пробел, табуляция, неразрывный пробел и прочие) и все символы конца строки (LF, CR и прочие).
Обратите внимание
Метод trim()
возвращает строку с вырезанными пробельными символами с её концов. Метод trim()
не изменяет значение самой строки.
Пример: использование метода trim()