Avatar ·

Как проверить, начинается ли строка с другой строки в JavaScript?

Всем привет! Я новичок в JavaScript и столкнулся с такой задачей: нужно проверить, начинается ли одна строка с определённой подстроки. Например, у меня есть список email-адресов, и я хочу отфильтровать те, которые начинаются с "admin". Или нужно проверить, начинается ли имя файла с "report_". Я пробовал использовать indexOf, но это кажется костылём. Вот мой код: ```javascript let str = "JavaScript is awesome"; if (str.indexOf("Java") === 0) { console.log("Строка начинается с Java"); } ``` Это работает, но мне сказали, что есть более современный способ. Я слышал про метод startsWith(), но не уверен, как он работает и поддерживается ли везде. Подскажите, пожалуйста, как правильно и красиво решить эту задачу? Может быть, есть ещё какие-то хитрости для проверки начала строки? Ещё вопрос: а если мне нужно проверить без учёта регистра? Или если строка содержит спецсимволы? Буду благодарен за подробный ответ с примерами. <<>>

Современный метод: String.prototype.startsWith()

Начиная с ECMAScript 6 (ES6), в JavaScript появился нативный метод startsWith(), который решает вашу задачу элегантно и читаемо. Он возвращает true, если строка начинается с указанной подстроки, и false в противном случае.

const str = "JavaScript is awesome";
console.log(str.startsWith("Java"));   // true
console.log(str.startsWith("Script")); // false
console.log(str.startsWith("javascript")); // false (регистр важен)

Синтаксис и дополнительные параметры

Метод принимает два аргумента:

  • searchString — подстрока, которую нужно проверить в начале строки.
  • position (необязательный) — позиция в строке, с которой начинать поиск (по умолчанию 0).
// Пример с position
const email = "admin@example.com";
console.log(email.startsWith("admin"));        // true
console.log(email.startsWith("admin", 0));     // true
console.log(email.startsWith("example", 5));   // true (начинается с 5-го символа)

Проверка без учёта регистра

Метод startsWith() чувствителен к регистру. Если нужно игнорировать регистр, приведите обе строки к одному регистру:

const str = "Hello World";
const prefix = "hello";
console.log(str.toLowerCase().startsWith(prefix.toLowerCase())); // true

Обработка спецсимволов

Метод корректно работает с любыми символами, включая спецсимволы, пробелы и Unicode:

const special = "Привет! $100";
console.log(special.startsWith("Привет")); // true
console.log(special.startsWith("$"));      // false (не в начале)
console.log(special.startsWith("Привет! ")); // true

Альтернативные подходы (если нужно поддерживать старые браузеры)

Хотя startsWith() поддерживается во всех современных браузерах (IE не поддерживает), можно использовать полифилл или старый добрый indexOf:

// Через indexOf (как у вас)
if (str.indexOf("Java") === 0) {
    // ...
}

// Через slice
if (str.slice(0, 4) === "Java") {
    // ...
}

// Через регулярное выражение
if (/^Java/.test(str)) {
    // ...
}

Практический пример: фильтрация email-адресов

const emails = [
    "admin@site.com",
    "user@site.com",
    "admin@test.org",
    "support@site.com"
];

const adminEmails = emails.filter(email => email.startsWith("admin"));
console.log(adminEmails); // ["admin@site.com", "admin@test.org"]

Важные замечания

  • Метод startsWith() не изменяет исходную строку.
  • Если передать пустую строку "", метод вернёт true (любая строка начинается с пустой строки).
  • Для проверки окончания строки используйте endsWith().
<<>>

Использование регулярных выражений для гибкой проверки

Если вам нужна более сложная логика (например, проверка с учётом регистра или с паттернами), регулярные выражения — отличный выбор. Метод test() возвращает true, если строка соответствует шаблону.

// Проверка с игнорированием регистра
const str = "Hello World";
console.log(/^hello/i.test(str)); // true (флаг i — ignore case)

// Проверка на несколько вариантов начала
const url = "https://example.com";
console.log(/^(http|https):\/\//.test(url)); // true

// Проверка на цифры в начале
const code = "123abc";
console.log(/^\d/.test(code)); // true

Сравнение с startsWith()

Регулярные выражения более мощные, но могут быть менее производительными для простых проверок. Для базовых случаев используйте startsWith() — он читаемее и быстрее. Если же вам нужно проверять сложные шаблоны (например, "начинается с буквы, затем цифры"), регекспы незаменимы.

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

const filename = "config.json";
console.log(/^\./.test(filename)); // false (точка в регекспе — любой символ)
console.log(/^\./.test(".hidden")); // true (проверяем скрытый файл)

В большинстве реальных проектов достаточно startsWith(), но знание регулярных выражений расширяет ваши возможности.