Являются ли / regex / Literals объектами RegExp всегда? - PullRequest
9 голосов
/ 25 августа 2009

По сути, мой вопрос о том, как Javascript обрабатывает литералы регулярных выражений.

В отличие от числа, строки и логического значения, где литералы являются примитивными типами данных и соответствующие объекты Number, String и Boolean существуют с бесшовным преобразованием типов, являются литералами регулярных выражений анонимными экземплярами объекта RegExp или это случай с регулярным выражением, рассматриваемый как примитив данные с плавным преобразованием типов в RegExp?

«Полный справочный Javascript, 2-е издание, Пауэлл и Шнайдер (МЗ)» противоречит сам себе - в одном месте авторы говорят, что / regex / автоматически вводится в RegExp, когда это необходимо, а в другом месте говорят, что / regex / является ничего, кроме экземпляра RegExp!

РЕДАКТИРОВАТЬ: Пожалуйста, предоставьте ссылку на надежный источник

Ответы [ 3 ]

13 голосов
/ 25 августа 2009

Вот что спецификация должна сказать:

Литерал регулярного выражения - это элемент ввода, который преобразуется в объект RegExp при сканировании. Объект создается до начала оценки содержащейся программы или функции. Оценка литерала дает ссылку на этот объект; это не создает новый объект. Два литерала регулярного выражения в программе оцениваются как объекты регулярного выражения, которые никогда не сравниваются как === друг с другом, даже если содержимое двух литералов идентично.

Не существует примитивного типа регулярного выражения, который автоматически блокирует объект так же, как string или number.

Обратите внимание, однако, что не все браузеры реализуют поведение «экземпляр-один-на-литерал», включая Safari и IE6 (и, возможно, позже), поэтому переносимый код не должен зависеть от него. Неудачный черновик ECMAScript 4 изменил бы поведение для соответствия этим браузерам:

В ES3 литерал регулярного выражения, например /a*b/mg, обозначает один уникальный объект RegExp, который создается при первом обнаружении литерала во время оценки. В ES4 новый объект RegExp создается каждый раз, когда встречается литерал во время оценки.

Кроме того, некоторые браузеры ( Firefox <3 </a>, Safari ) сообщают typeof /regex/ как "function", поэтому переносимый код должен избегать typeof в экземплярах RegExp - придерживайтесь instanceof.

6 голосов
/ 25 августа 2009

Да, следующие два выражения эквивалентны:

var r1 = /ab+c/i,
    r2 =new RegExp("ab+c", "i");

Свойство конструктора обеих точек на функцию конструктора RegExp :

(/ab+c/i).constructor === RegExp // true
r2.constructor === RegExp // true

И литерал регулярного выражения является экземпляром RegExp:

 /ab+c/i instanceof RegExp // true

Основное различие заключается в том, что определение регулярных выражений с помощью функции конструктора позволяет создавать и компилировать выражение из строки. Это может быть очень полезно для построения сложных выражений, которые будут использоваться повторно.

1 голос
/ 25 августа 2009

Да, new RegExp ("что-то", "g") совпадает с / что-то / g

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...