В настоящее время ответы, приведенные здесь, не являются полностью полными / правильными.
Начиная с ES5, буквальный синтаксис аналогичен синтаксису RegExp()
в отношении создания объекта: они оба создают новый объект RegExp каждый раз, когда путь кода встречает выражение, в котором они принимают участие .
Следовательно, единственное различие между ними состоит в том, как часто это регулярное выражение компилируется :
- С буквальным синтаксисом - один раз во время первоначального анализа кода и
компиляции
- С синтаксисом
RegExp()
- каждый раз, когда создается новый объект
См., Например, Шаблоны JavaScript Стояна Стефанова book:
Еще одно различие между литералом регулярного выражения и
Конструктор состоит в том, что литерал создает объект только один раз за
разбор времени. Если вы создаете одно и то же регулярное выражение в цикле,
ранее созданный объект будет возвращен со всеми его свойствами
(например, lastIndex) уже установлен с первого раза. Рассмотрим
Следующий пример в качестве иллюстрации того же объекта
вернулся дважды.
function getRE() {
var re = /[a-z]/;
re.foo = "bar";
return re;
}
var reg = getRE(),
re2 = getRE();
console.log(reg === re2); // true
reg.foo = "baz";
console.log(re2.foo); // "baz"
Это поведение изменилось в ES5, и литерал также создает новые объекты. Поведение также было исправлено во многих браузерах.
среды, поэтому на нее нельзя положиться.
Если вы запустите этот пример во всех современных браузерах или NodeJS, вы получите следующее:
false
bar
Это означает, что e в то время, когда вы вызываете функцию getRE()
, новый объект RegExp
создается даже при использовании буквального синтаксиса .
Вышеприведенное не только объясняет, почему вы не должны использовать RegExp()
для неизменяемых регулярных выражений (это очень известная проблема производительности сегодня), но также объясняет:
(меня больше удивляет, что inlineRegExp и storeRegExp имеют разные
Результаты.)
В браузерах storedRegExp
примерно на 5-20% быстрее, чем inlineRegExp
, потому что нет никаких затрат на создание (и сбор мусора) нового объекта RegExp
каждый раз.
Вывод:
Всегда создавайте свои неизменяемые регулярные выражения с буквальным синтаксисом и кэшируйте их, если они будут использоваться повторно. Другими словами, не полагайтесь на эту разницу в поведении в envs ниже ES5, и продолжайте надлежащим образом кэшировать в envs выше.
Почему буквальный синтаксис? Он имеет некоторые преимущества по сравнению с синтаксисом конструктора:
- Это короче и не заставляет вас думать с точки зрения классового
Конструкторы.
- При использовании конструктора
RegExp()
вам также необходимо экранировать кавычки и обратные слэши с двойным экранированием. Делает регулярные выражения
которые по своей природе трудно читать и понимать еще сложнее.
(Бесплатное цитирование из того же Шаблоны JavaScript Стояна Стефанова книга).
Следовательно, всегда полезно придерживаться буквального синтаксиса, если ваше регулярное выражение не известно во время компиляции.