Работа со строками в JavaScript: полное руководство

Раздел: программирование на javascript -> манипуляции со строками

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

Как проверить, содержит ли строка заданную подстроку?

Самый современный и простой способ - метод includes(). Он возвращает true, если подстрока найдена, иначе false. Регистр учитывается.

const str = 'Привет, мир!';
console.log(str.includes('мир')); // true
console.log(str.includes('Мир')); // false (регистр)

Js строки (работа со строками javascript)

Цель и случай использования: Когда нужно просто узнать, входит ли подстрока, без дополнительной информации о позиции. Например, проверка наличия ключевого слова в тексте.

Проблема: includes() не поддерживается в Internet Explorer. Для старых браузеров требуется полифил или альтернатива indexOf.

Типичная ошибка: Использование includes с регулярным выражением (не сработает, нужен search или test).

Как найти индекс первого вхождения подстроки?

Метод indexOf() возвращает индекс первого символа подстроки или -1, если подстрока не найдена. Регистр важен.

const str = 'JavaScript - мощный язык';
const idx = str.indexOf('мощный');
console.log(idx); // 13
if (idx !== -1) {
  console.log('Подстрока найдена на позиции ' + idx);
}

Цель: Когда требуется узнать положение подстроки, например, для последующего извлечения части строки или замены.

Ошибка: Путаница с проверкой if (str.indexOf('text')) - это сработает неверно, если подстрока находится в начале (индекс 0, который приводится к false). Нужно явно сравнивать с -1.

Проблема: indexOf поддерживается во всех браузерах, включая IE.

Как выполнить поиск с использованием регулярного выражения?

Метод search() принимает регулярное выражение и возвращает индекс первого совпадения или -1. Флаг i делает поиск регистронезависимым.

const str = 'Hello, World!';
console.log(str.search(/world/i)); // 7
console.log(str.search(/mars/i));  // -1

Цель: Когда нужен гибкий шаблон (цифры, символы, повторы), или регистронезависимый поиск без преобразования всей строки.

Проблема: Если строка содержит специальные символы регулярных выражений (точка, скобки), их необходимо экранировать, например, str.search(new RegExp(escapedString)).

Типичная ошибка: Передача строки в search без регулярного выражения - она будет неявно преобразована, но игнорирует флаги.

Как проверить, начинается или заканчивается строка на определённую подстроку?

Методы startsWith() и endsWith() возвращают true/false. Учитывают регистр. Можно указать начальную позицию для startsWith.

const url = 'https://example.com';
console.log(url.startsWith('https')); // true
console.log(url.endsWith('.com'));     // true
console.log(url.startsWith('example', 8)); // true

Цель: Проверка протокола, расширения файла, префиксов в строках.

Проблема: В IE эти методы не поддерживаются (требуется полифил). Для старых браузеров используются indexOf в комбинации с length.

Типичная ошибка: Забыть про регистр - методы чувствительны к нему по умолчанию.

Дополнительные примеры работы со строками

Конкатенация строк

Оператор + или метод concat().

Пример
const a = 'Hello';
const b = 'World';
console.log(a + ', ' + b + '!'); // Hello, World!
console.log(a.concat(', ', b, '!')); // Hello, World!
Hello, World!
Hello, World!

Шаблонные строки (template literals)

Вставка выражений через ${} и многострочность.

Пример
const name = 'Анна';
const age = 25;
const greeting = `Привет, ${name}! Тебе ${age} лет.`;
console.log(greeting);
const multi = `Строка
на нескольких
строках`;
console.log(multi);
Привет, Анна! Тебе 25 лет.
Строка
на нескольких
строках

Извлечение подстроки: slice, substring, substr

slice(start, end) и substring(start, end) похожи, но substring меняет местами аргументы, если start > end. substr (устаревший) использует длину.

Пример
const str = 'JavaScript';
console.log(str.slice(0, 4));   // Java
console.log(str.substring(4, 0));// Java (меняет)
console.log(str.substr(4, 6));  // Script
Java
Java
Script

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

Метод split() делит строку по разделителю. join() собирает массив в строку.

Пример
const csv = 'яблоко, груша, банан';
const arr = csv.split(', ');
console.log(arr); // ['яблоко', 'груша', 'банан']
console.log(arr.join('; ')); // яблоко; груша; банан
['яблоко', 'груша', 'банан']
яблоко; груша; банан

Удаление пробелов с краёв

trim(), trimStart(), trimEnd() удаляют пробелы и другие whitespace-символы.

Пример
const spaced = '   Hello   ';
console.log(spaced.trim());       // 'Hello'
console.log(spaced.trimStart()); // 'Hello   '
console.log(spaced.trimEnd());   // '   Hello'
Hello
Hello   
   Hello

Дополнение строки до заданной длины

padStart() и padEnd() добавляют символы слева или справа.

Пример
const hour = '9';
const minute = '5';
console.log(hour.padStart(2, '0'));    // '09'
console.log(minute.padEnd(2, '0'));    // '50'
console.log('123'.padStart(6, '*'));  // '***123'
09
50
***123

Повторение строки

Метод repeat() повторяет строку заданное количество раз.

Пример
const laugh = 'ха';
console.log(laugh.repeat(3)); // 'хахаха'
console.log('!'.repeat(5));   // '!!!!!'
хахаха
!!!!!

Изменение регистра

toUpperCase() и toLowerCase(). Для локально-зависимых преобразований: toLocaleUpperCase().

Пример
const text = 'Привет, Мир!';
console.log(text.toUpperCase()); // ПРИВЕТ, МИР!
console.log(text.toLowerCase()); // привет, мир!
const turkish = 'iI';
console.log(turkish.toLocaleUpperCase('tr')); // 'İI' (турецкая I)
ПРИВЕТ, МИР!
привет, мир!
İI

Регулярные выражения: exec и matchAll

Метод exec() возвращает совпадения с группами. matchAll() - итератор всех совпадений.

Пример
const regex = /(\d+)/g;
const str = 'Цена: 100 руб, скидка 20';
let match;
while ((match = regex.exec(str)) !== null) {
  console.log(`Найдено число: ${match[1]} на позиции ${match.index}`);
}
// Альтернатива с matchAll:
const matches = [...str.matchAll(/[а-я]+/gi)];
console.log(matches.map(m => m[0])); // ['Цена', 'руб', 'скидка']
Найдено число: 100 на позиции 6
Найдено число: 20 на позиции 23
['Цена', 'руб', 'скидка']

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

localeCompare() сравнивает строки с учётом локали. Возвращает -1, 0 или 1.

Пример
const a = 'éclair';
const b = 'zèbre';
console.log(a.localeCompare(b, 'fr')); // -1 (éclair идёт раньше)
console.log('a'.localeCompare('A')); // 0 или 1 в зависимости от локали
-1
0

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

parseInt, parseFloat, унарный +, Number().

Пример
const numeric = '42.5px';
console.log(parseInt(numeric));   // 42
console.log(parseFloat(numeric)); // 42.5
console.log(+'15');               // 15
console.log(Number(''));          // 0
console.log(parseInt('0xFF'));    // 255 (шестнадцатеричная)
42
42.5
15
0
255

Доступ к символам: charAt, charCodeAt, codePointAt

Для корректной работы с суррогатными парами (эмодзи) рекомендуется codePointAt().

Пример
const emoji = '?';
console.log(emoji.length);                // 2 (суррогатная пара)
console.log(emoji.charCodeAt(0));         // 55357 (0xD83D)
console.log(emoji.codePointAt(0));       // 128522 (полный код)
console.log(emoji.charAt(0));            // '\uD83D'
2
55357
128522
\uD83D

Проверка на пустую строку

Простое условие if (str) не сработает для строки из пробелов. Лучше использовать trim().

Пример
const empty = '';
const spaced = '   ';
console.log(!!empty);          // false (пустая строка - falsy)
console.log(!!spaced);         // true (пробелы - truthy)
console.log(spaced.trim() === ''); // true
false
true
true

Замена подстроки: replace и replaceAll

Метод replace() заменяет первое совпадение; с глобальным флагом - все. replaceAll() заменяет все без необходимости флага.

Пример
const sentence = 'Кот и котёнок';
console.log(sentence.replace('кот', 'пёс'));      // Кот и пёсёнок (регистр)
console.log(sentence.replace(/кот/gi, 'пёс'));    // пёс и пёсёнок
console.log(sentence.replaceAll('кот', 'пёс'));   // Кот и пёсёнок (без флага)
Кот и пёсёнок
пёс и пёсёнок
Кот и пёсёнок

Проверка начала и конца с indexOf

Альтернатива startsWith и endsWith для старых браузеров.

Пример
const str = 'Hello World';
console.log(str.indexOf('Hello') === 0); // true
console.log(str.lastIndexOf('World') === str.length - 'World'.length); // true
true
true

работа со строками javascript - comments

En
Js строки (javascript)