Строки в Javascript

В Javascript для хранения данных, которые могут быть представлены в текстовой форме, используются строки. Строки являются одним из 6 примитивных типов.

Создание строк

Строки можно создавать, заключая их текстовое содержимое в кавычки. Вы можете использовать двойные, одинарные или обратные кавычки.

<code>
const str1 = «firstmessage»;
const str2 = ‘second message’;
const str3 = `thrid message`;
</code>

Строки, создаваемые с помощью одинарных и двойных кавычек, называются строковыми литералами. Те, что используют обратные кавычки, являются шаблонными литералами, потому что они позволяют производить подстановку (интерполяцию) выражений и могут использоваться как теговые шаблоны (taggedtemplates). Использование последних встречается довольно редко, поэтому не будет рассмотрено в данной статье.

<code>
const name = «Carl»;
const personalMessage = `Message for ${name}`; // Message for Carl
</code>

Если вы работаете с многострочным текстом, то ваш выбор должен падать именно на шаблонные литералы.

<code>
const poeticMessage = (
`who can
remain still
while the
mud settles`
);
</code>

Если вам по какой-то причине нужно использовать обычные строковые литералы, то о читаемости можете забыть.

<code>
const poeticMessage2 = ‘who can\nremain still\nwhile the\nmud\’s settling’;
</code>

Во втором сообщении используются одинарные кавычки для создания строки, из-за чего аналогичные в содержании сообщения приходится экранировать (\’). Также для переноса строк добавлен специальный символ \n.

Чтение символов строки

Со строками в Javascript работают как с массиво-подобными объектами. Поэтому вы можете получить конкретный символ строки, используя квадратные скобки.

<code>
const message = «Good day, Sir!»;
console.log(message[0], message[13]); // G !
</code>

При запуске выше предложенной программы в консоль будет выведено «G !», где «G» является первым символом строки (нумерация начинается с 0) и «!» — последний символ.

Строки неизменяемы

Если вы забудете, что все-таки имеете дело со строками, а не с массивами, и решите изменить какой-то символ.

<code>
let wrongMessage = «Goot day, Sir!»;
wrongMessage[3] = «d»;
console.log(wrongMessage); // Goot day, Sir!
</code>

У вас не получится, потому что строки не неизменяемы. Каждый раз, когда вы хотите изменить строку, вы должны создать новую. Это правило существует для всех примитивных типов Javascript. Если же вам необходимо это сделать, то преобразуйте строку в массив (более подробно будет рассказано ниже).

Доступ к строке как к массиву небезопасен

В большинстве случаев интерпретатор JS просто промолчит на вашу глупость, что не всегда желательно. Поэтому крайне рекомендуется запускать ваши программы в строгом режиме, добавив «usestrict» в начало скрипта. Если вы используете модули ES6, то в них строгий режим включен по умолчанию.

<code>
«use strict»;

console.log(wrongMessage); // TypeError
</code>

Запустите предыдущий пример с директивой «use strict», и в консоли появится ошибка «TypeError: Cannot assign to read only property ‘3’ of string ‘Goot day, Sir!’».

Рассмотрим другой случай. Скажем, автор скрипта слегка обсчитался и обратился к несуществующему символу.

<code>console.log(message[99]); // undefined</code>

Его код не вызовет ошибки, даже если включен строгий режим. Данное выражение просто вернет «undefined».Такое либеральное отношение интерпретатора к явным ошибкам программиста зачастую ведет к багам, источники которых трудно обнаружить.

Соединение строк

Строки можно складывать. Это работает также просто, как и звучит.

<code>
const welcomeMessage = personalMessage + «\n» + message;
console.log(welcomeMessage);
// Message for Carl
// Good day, Sir!
</code>

Если в таком суммировании участвуеткакой-нибудь объект или примитивный тип, то он неявно преобразуется в строку вызовом метода toString(). Данный метод определен в корневом классе Objectи всегда возвращает «[objecttype]», где type–тип объекта. Почти все классы, наследующие Object, переопределяют это метод.

<code>
constwelcomeCard = {};
welcomeCard.toString = _ => «Good day, «;
console.log(welcomeCard+ «James»); // Good day, James
</code>

Сравнение строк

Строки в Javascript кодируются с помощью UTF-16, то есть каждый символ представляет собой последовательность из 16 бит.

Строки можно сравнивать (очень полезно при сортировке). При этом сравниваются численные кодировки символов. Обычно они отображают порядок, в котором представлены буквы в соответствующих алфавитах.

<code>
const big = «Big»;
const small = «Small»;
console.log(big > small); // false
</code>

В приведенном выше фрагменте переменная big будет меньше small, потому что «B» встречается в английском алфавите раньше «S» и, следовательно, имеет меньший числовой код.

Иногда Unicode неверно отражает последовательность, в которой перечисляются символы в алфавите. Например, «ё» всегда будет больше остальных букв в русском алфавите. Для корректного сравнения рекомендуется всегда использовать метод localeCompare(строка, язык?, опции?). Напоминаю, в сигнатуре функции аргумент с вопросом означает, что он является необязательным и может отсутствовать.

<code>
const compareResult = «ёлка».localeCompare(«сосна», «ru»); // -1
console.log(compareResult> 0 ? true : false); // false
console.log(«ёлка» > «сосна»); // true
</code>

Метод localeCompare может принимать 3 аргумента: строку, язык и дополнительные опции. Он возвращает положительное число, если строка, вызывающая метод,при сортировке стоит позже (является большей), чем строка, переданная в качестве аргумента. Отрицательное число — в обратном случае и 0, если они равны.

Javascript: методы работы со строками

В языке предусмотрены различные методы (функции), которые могут понадобиться при работе со строками.

Cтроковые методы и свойства

Внимательный читатель, вероятно, заметил, что строки относятся к примитивным типам и не являются объектами и, следовательно, не должны иметь методов. Дело в том, что при вызове последних или при использовании свойств создается временный объект-обертка стандартного класса String. После того, как необходимая работа выполнена, данный объект уничтожается.

Например, длину строки можно узнать, используя свойство length.

<code>console.log(message.length); // 14</code>

Извлечение части строки

НесколькоJavascript методов позволяют получать подстроку:

<ul>
<li>
slice(начало?, конец?)
</li>
<li>
substring(начало?, конец?)
</li>
<li>
substr(начало?, длина?)
</li>
</ul>

Метод slice(начало?, конец?) возвращает часть строки от начала (включая) до конца (не включая).

<code>
const good = message.slice(0, 4); // Good
const day = message.slice(5, 8); // day
const sir = message.slice(-4, -1); // Sir
const exclamation = message.slice(-1); // !
const all = message.slice(); // Good day, Sir!
</code>

Отрицательные значения отсчитываются с конца. Если вы пропустили второй аргумент, то строка копируется до конца. Если использовали метод без аргументов, вы получите копию исходной строки.

Методы substring и substr работают аналогично, но первый разрешает вызовы, где начало больше, чем конец, а последний принимает в качестве второго аргумента длину подстроки.

Разделение строки на подстроки

Довольно часто возникает задача разделить предложение на слова. Метод split(разделитель?) принимает на вход разделитель, который может быть строкой или регулярным выражением, и возвращает массив, представляющий список выделенных подстрок.

<code>
const words = message.split(» «); // [ ‘Good’, ‘day,’, ‘Sir!’ ]
const symbols = message.split(«»); // [ ‘G’, ‘o’, ‘o’, ‘d’, ‘ ‘, ‘d’, ‘a’, ‘y’, ‘,’, ‘ ‘, ‘S’, ‘i’, ‘r’, ‘!’]
</code>

Преобразование строки в массив

При работе со строками часто возникает необходимость в их преобразовании в массив из-за большего количества функций (forEach, map, splice и другие) и возможности изменения данных без копирования. Такого результата можно добиться, используя, как показано выше, функцию split(«») или Array.from(строка).

<code>const array = Array.from(message); // [ ‘G’, ‘o’, ‘o’, ‘d’, ‘ ‘, ‘d’, ‘a’, ‘y’, ‘,’, ‘ ‘, ‘S’, ‘i’, ‘r’, ‘!’]</code>

Преобразование в верхний или нижний регистр

Методы toLowerCase() и toUpperCase() позволяют преобразовывать все буквы в строке в нижний или верхний регистр соответственно.

<code>
const shout = message.toUpperCase(); // GOOD DAY, SIR!
const whisper = message.toLowerCase(); // good day, sir!
</code>

Javascript: как проверить, содержит ли строка подстроку

Для проверки вхождения подстроки в строку используйте includes(строка). Данный метод принимает на вход подстроку и возвращает true, если строка была найдена, иначе – false.

<code>message.includes(«Sir»); // true</code>

Если вам нужно определить начинается или заканчивается строка определенной последовательностью символов, то startsWith(строка) и endsWith(строка) делают именно это.

<code>
message.startsWith(«Good»); // true
message.endsWith(«Sir»); // false
</code>

Поиск подстроки в строке

Если вам нужно найти позицию, с которой начинается подстрокав строке, или вы ищите подстроку, которая удовлетворяет определенному условию (регулярному выражению), то для данной задачи подходят следующие методы: indexOf(), lastIndexOf(), search(), match(), exec() и matchAll(). Их подробное описание вы можете найти в следующей статье.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *