Тип данных String. Его особенности, свойства, методы. Строковые шаблоны.
В JavaScript любые текстовые данные являются строками. Не существует отдельного типа «символ», который есть в ряде других языков. Внутренним форматом строк, вне зависимости от кодировки страницы, является 16-разрядный Юникод (Unicode).
Создание строк
Строки создаются при помощи двойных или одинарных кавычек:
let text = "моя строка";
let anotherText = 'еще строка';
Специальные символы
Строки могут содержать специальные символы. Самый часто используемый из таких символов – это «перевод строки».
Есть и более редкие символы, вот их список:
Специальные символы | |
Символ | Описание |
\b | Backspace |
\f | Form feed |
\n | New line |
\r | Carriage return |
\t | Tab |
\uNNNN | Символ в кодировке Юникод с шестнадцатеричным кодом `NNNN`. Например, `\u00A9` - юникодное представление символа копирайт © |
Экранирование специальных символов
Экранирование служит исключительно для правильного восприятия строки JavaScript. В памяти строка будет содержать сам символ без '\'.
\0 — ноль-символ
\' — одинарная кавычка
\" — двойная кавычка
\\ — обратный слэш
\b — забой
\f — разрыв страницы
\n — новая строка
\r — возврат каретки
\t — табуляция
\v — вертикальная табуляция
\uFFFF (4 шестнадцатеричных цифры) — символ по Unicode-коду
\u{F} … \u{FFFFFF} — расширенный юникод
\xFF — символ по коду ASCII Latin-1
Многострочность
Строка однострочная. Для многострочной можно в конце поставить «`\`» (перевод строки игнорируется):
'Пример текста\
занимающего две строки'
=== 'Пример текста занимающего две строки' // true
Или использовать шаблоны (перевод строки учитывается):
`Пример текста
занимающего две строки`
=== 'Пример текста\nзанимающего две строки' // true
Операции
Объединение строк — оператор «+»:
'Hello' + ' world' // 'Hello world'
Сравнение происходит побуквенно по алфавиту (таблице символов):
'abc' === 'abc'
'abc' === 'a' + 'b' + 'c'
'a' < 'b' // true
'c' < 'b' // false
'abcd' < 'abcd' // false
'abcd' < 'abdc' // true
Методы и свойства
Свойство length
Одно из самых частых действий со строкой – это получение ее длины:
‘text’.length; // 4
Доступ к символам
charAt( index: number ): string
— получить символ в заданной позиции (от нуля). Если запрошенная позиция выходит за пределы строки, вернётся пустая строка.
'text'.charAt( 1 ); // 'e'
'text'.charAt( -1 ); // ''
'text'.charAt( 10 ); // ''
'text'.charAt( 0 ); // 't'
Также для доступа к символу можно использовать квадратные скобки:
‘text’ [0]; // "t"
Разница между этим способом и charAt заключается в том, что если символа нет – charAt выдает пустую строку, а скобки – undefined:
"".charAt(0); // пустая строка
"" [0]; // undefined
Изменения строк
Содержимое строки в JavaScript нельзя изменять. Нельзя взять символ посередине и заменить его. Как только строка создана – она такая навсегда.
Можно лишь создать целиком новую строку и присвоить в переменную вместо старой, например:
let str = "строка";
str = str[3] + str[4] + str[5];
alert( str ); // ока
Смена регистра
Методы toLowerCase() и toUpperCase() меняют регистр строки на нижний/верхний:
"Интерфейс".toUpperCase(); // ИНТЕРФЕЙС
Пример ниже получает первый символ и приводит его к нижнему регистру:
"Интерфейс" [0].toLowerCase(); // 'и'
Поиск подстроки
indexOf( searchString: string, fromIndex?: number )
- возвращает позицию, на которой находится подстрока или -1, если ничего не найдено. Например:
'test text'.indexOf( 't' ) // 0
'test text'.indexOf( 't', 1 ) // 3
'test text'.indexOf( 'te', 1 ) // 5
'test text'.indexOf( 'z' ) // -1
lastIndexOf( searchString: string, toIndex?: number )
— находит последнее вхождение подстроки `searchString` в строке до позиции `toIndex` (0..длина), если указана, иначе — до конца строки. Возвращается позиция первого символа (от нуля), или «-1», если вхождения нет.
'test text'.lastIndexOf( 't' ) // 8
'test text'.lastIndexOf( 't', 7 ) // 5
'test text'.lastIndexOf( 'te' ) // 5
'test text'.lastIndexOf( 'z' ) // -1
includes( searchString: string, position?: number ): Boolean
— проверяет вхождение подстроки `searchString` в строке, начиная от позиции `position` (0..длина), если указана, иначе — с начала строки. Возвращает `true`, если подстрока найдена, иначе — `false`.
'test text'.includes( 't' ) // true
'test text'.includes( 'st' ) // true
'test text'.includes( 'st', 3 ) // false
'test text'.includes( 'z' ) // false
endsWith( searchString: string, endPosition?: number ): Boolean
— проверяет, что строка завершается подстрокой `searchString`. Если указано `endPosition`, то строка считается данной длины, иначе поиск идёт до конца строки.
'test text'.endsWith( 't' ) // true
'test text'.endsWith( 'x' ) // false
'test text'.endsWith( 'st', 4 ) // true
'test text'.endsWith( 'st', 5 ) // false
Взятие подстроки: substr, substring, slice
В JavaScript существуют целых 3 метода для взятия подстроки, с небольшими отличиями между ними.
substring(start [, end])
- возвращает подстроку с позиции start до, но не включая end. Если аргумент end отсутствует, то идет до конца строки.
‘stringify’.substring(0,1)); // "s"
‘stringify’.substring(2)); // "ringify"
substr(start [, length])
- первый аргумент имеет такой же смысл, как и в substring, а второй содержит не конечную позицию, а количество символов. Если второго аргумента нет – подразумевается «до конца строки».
‘stringify’.substr(2,4); // ring
slice(start [, end])
- возвращает часть строки от позиции start до, но не включая, позиции end.
Отрицательные аргументы
Различие между substring и slice – в том, как они работают с отрицательными и выходящими за границу строки аргументами:
substring(start, end)
Отрицательные аргументы интерпретируются как равные нулю. Слишком большие значения усекаются до длины строки:
"testme".substring(-2); // "testme", -2 становится 0
Кроме того, если start > end, то аргументы меняются местами, т.е. возвращается участок строки междуstart и end:
"testme".substring(4, -1); // "test"
// -1 становится 0 -> получили substring(4, 0)
// 4 > 0, так что аргументы меняются местами -> substring(0, 4) = "test"
slice(start [, end])
Отрицательные значения отсчитываются от конца строки:
"testme".slice(-2); // "me", от 2 позиции с конца
"testme".slice(1, -1); // "estm", от 1 позиции до первой с конца.
Кодировка Юникод
charCodeAt( index: number ): number
— возвращает числовой Unicode-код символа (0…65535). При выходе за диапазон возвращает NaN.
'text'.charCodeAt( 1 ) // 101
'text'.charCodeAt( 10 ) // NaN
codePointAt( position: number ): number | undefined
— возвращает числовой Unicode-код символа с подержкой суррогатных пар (два 16-битных значения, где каждое значение лежит в диапазоне от 0xD800 и до 0xDFFF; другими словами, два «типа символа» образуют один «настоящий» символ). Если в указанной позиции нет символа, возвращается `undefined`.
'text'.codePointAt( 1 ) // 101
'text'.codePointAt( 10 ) // undefined
'\uD800\uDC00'.codePointAt( 0 ) // 65536
Другие методы
concat( ...strings: string[] ): string
— объединение двух или более строк. Объединение через оператор «+» является предпочтительнее.
't'.concat( 'e', 'x', 't' ) // 'text'
localeCompare( compareString: string ): number
— сравнивает две строки. Если compareString больше — результат отрицательный, меньше — положительный, равны — нулевой.
'a'.localeCompare( 'b' ) // -1
'a'.localeCompare( 'c' ) // -1
'ё'.localeCompare( 'я' ) // -1
trim(): string
— удаляет интервальные символы по сторонам строки (пробелы, табуляцию, переводы строк).
' test \t\n '.trim() === 'test'
search( regexp: string | RegExp ): number
— находит первое совпадение регулярного выражения со строкой. Глобальный поиск не осуществляет (флаг «g» не учитывается).
'test text'.search( /.t/ ) // 2
'test text'.search( '.t' ) // 2
'test text'.search( /^.t/ ) // -1
match( regexp: string | RegExp ): RegExpMatchArray | null
— возвращает перечень совпадений регулярного выражения по строке.
'test text'.match( /.t/g ) // [ 'st', ' t', 'xt' ]
replace( searchValue: string | RegExp, replaceValue: string | Function )
— производит поиск с заменой по строке. В результате возвращает новую строку. Шаблон для совпадения может быть регулярным выражением или строкой. Результат, на который заменять, может быть строкой или функцией. В последнем случае замена производятся на результат работы функции.
Строка замены понимает следующие мета-последовательности:
* `$$` — символ «$»
* `$&` — совпавшая подстрока
* `$`` — часть строки до совпадения
* `$'` — часть строки после совпадения
* `$1`, `$2`, … — результат совпадения соответствующего подшаблона регулярного выражения
Функция замены принимает следующие аргументы:
* math — совпавшая подстрока
* p1, p2, … — результат совпадения соответствующего подшаблона регулярного выражения
* offset — позиция подстроки в строке
* string — исходная строка
'test text'.replace( 'te', 'be' ) // 'best text'
'test text'.replace( /te/, 'be' ) // 'best text'
'test text'.replace( /te/g, 'be' ) // 'best bext'
'test text'.replace( ' ', '[$`]<$&>($\')' ) // 'test[test]< >(text)text'
split( [separator][, limit] )
— разделяет строку на массив подстрок.
separator — разделитель строки, может быть строкой или регулярным выражением.
limit — устанавливает ограницение на количество разделяемых частей.
'test text'.split() // [ 'test text' ]
'test text'.split( '' ) // ['t', 'e', 's', 't', ' ', 't', 'e', 'x', 't']
'test text'.split( ' ' ) // [ 'test', 'text' ]
'test text'.split( 't' ) // [ '', 'es', ' ', 'ex', '' ]
'test text'.split( 't', 3 ) // [ '', 'es', ' ' ]
String.fromCharCode( num1, ..., numN )
— строка из кодов символов.
String.fromCharCode( 65, 66, 67 ) // ABC
Строковые шаблоны
Добавлен новый вид кавычек для строк:
let str = `обратные кавычки`;
Основные отличия:
ü Поддерживают многострочность
`моя
многострочная
строка`;
ü Можно вставлять выражения при помощи${…}
`2 + 3 = ${2 + 3}`; // 2 + 3 = 5
При помощи ${…} можно вставлять как значение переменной, так и более сложные выражения, которые могут включать в себя операторы, вызовы функций и т.п. Такую вставку называют «интерполяцией».
ü Поддерживают тег-функцию
Название этой функции ставится перед первой обратной кавычкой:
let str = func`моя строка`;
Эта функция будет автоматически вызвана и получит в качестве аргументов строку, разбитую по вхождениям параметров ${…} и сами эти параметры.
function myTag( strings, ...values )
{
console.log( strings );
console.log( strings.raw );
console.log( values );
return `[${strings.join( '][' )}]`;
}
myTag`Test \u263A ${1} template ${2} literal ${3} string`
В strings.raw содержатся участки строки в «изначально введённом» виде. То есть, если в строке находится \n или \u1234 или другое особое сочетание символов, то оно таким и останется.