Что-то, что часто делается во фронтенд-разработке, это проверка того, соответствует ли строка какому-то шаблону или содержит какую-то подстроку. Объект String
в Javascript предоставляет для этого несколько удобных методов: match
, search
, indexOf
и lastIndexOf
. (Конечно, если вы хотите проверить, что строка точно соответствует другой строке, ничто не сравнится с простым старым оператором ===
.) Альтернативой использованию методов String
является использование метода test
из RegExp
. При этом производительность не снижается по сравнению с match
и search
, поскольку они неявно преобразуют свои аргументы в регулярные выражения.
Однако основным преимуществом использования test
вместо match
является надежность. Строка, которую вы тестируете, обычно является ненадежной переменной: она исходит от пользовательского ввода или ответа API. Если эта переменная должна быть undefined
или null
вместо строки, то match
вызовет ошибку во время выполнения. Однако, если вместо этого вы использовали test
из RegExp
, то проверка возможного неопределенного или нулевого значения просто вернет false. Когда вы пишете код для проверки строки, вы, как правило, жестко кодируете регулярное выражение, поэтому во время выполнения известно, что оно существует, а строка — нет.
Динамические регулярные выражения
Что, если регулярное выражение создается во время выполнения? Предположим, вы написали этот код, чтобы проверить, есть ли у пользователя учетная запись электронной почты с вами:
email.match(`${username}@myDomain.com`);
Как вы могли написать это как регулярное выражение?
Так же, как match
делает неявно: используя объект RegExp
вместо создания литерала регулярного выражения.
RegExp(`${username}@myDomain.com`).test(email);
Вывод
Если вы хотите устранить ошибки времени выполнения из-за вызова match
для нулевых или неопределенных переменных, начните писать свои проверки регулярных выражений сначала с регулярным выражением, используя test
. Он намного надежнее и по-прежнему легко читается.