typeof для RegExp - PullRequest
       47

typeof для RegExp

129 голосов
/ 02 декабря 2010

Есть ли способ определить, является ли объект JavaScript регулярным выражением?

Например, я хотел бы сделать что-то вроде этого:

var t = /^foo(bar)?$/i;
alert(typeof t); //I want this to return "regexp"

Возможно ли это?

Спасибо!

РЕДАКТИРОВАТЬ: Спасибо за все ответы.Кажется, у меня есть два очень хороших варианта:

obj.constructor.name === "RegExp"

или

obj instanceof RegExp

Какие-нибудь главные плюсы / минусы любого метода?

Еще раз спасибо!

Ответы [ 8 ]

171 голосов
/ 02 декабря 2010

Вы можете использовать instanceof оператор:

var t = /^foo(bar)?$/i;
alert(t instanceof RegExp);//returns true

Фактически, это почти так же, как:

var t = /^foo(bar)?$/i;
alert(t.constructor == RegExp);//returns true

Имейте в виду, что, поскольку RegExp не является примитивным типом данных , невозможно использовать оператор typeof, который может быть лучшим вариантом на этот вопрос.

Но вы можете использовать этот трюк выше или другие, такие как тип утки проверка , например, проверка, имеет ли такой объект какие-либо жизненно важные методы или свойства, или его внутренняя значение класса (с помощью {}.toString.call(instaceOfMyObject)).

22 голосов
/ 02 декабря 2010
alert( Object.prototype.toString.call( t ) ); // [object RegExp]

Это способ, указанный в спецификации для получения класса объекта.

Из ECMAScript 5, раздел 8.6.2 Внутренние свойства и методы объекта :

Значение внутреннего свойства [[Class]] определяется этой спецификацией для каждого типа встроенного объекта.Значением внутреннего свойства [[Class]] хост-объекта может быть любое строковое значение, кроме одного из «Аргументы», «Массив», «Логическое значение», «Дата», «Ошибка», «Функция»,«JSON», «Math», «Number», «Object», «RegExp» и «String» .Значение внутреннего свойства [[Class]] используется внутри, чтобы различать различные виды объектов.Обратите внимание, что эта спецификация не предоставляет программе средств для доступа к этому значению, кроме как через Object.prototype.toString (см. 15.2.4.2).

RegExp - это класс объекта, определенный в спецификациив Раздел 15.10 Объекты RegExp (RegularExpression) :

Объект RegExp содержит регулярное выражение и соответствующие флаги.

13 голосов
/ 02 декабря 2010

Дайте свойству .constructor водоворот:

> /^foo(bar)?$/i.constructor
function RegExp() { [native code] }
> /^foo(bar)?$/i.constructor.name
"RegExp"
> /^foo(bar)?$/i.constructor == RegExp
true
10 голосов
/ 02 декабря 2010

С underscore.js

// Is the given value a regular expression?
  _.isRegExp = function(obj) {
    return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
  };
3 голосов
/ 02 декабря 2010

Работает в Google Chrome:

x = /^foo(bar)?$/i;
x == RegExp(x); // true
y = "hello";
y == RegExp(y); // false
0 голосов
/ 04 июля 2014

Вот два способа:

/^\/.*\/$/.test(/hi/) /* test regexp literal via regexp literal */
/^\/.*\/$/.test(RegExp("hi") ) /* test RegExp constructor via regexp literal */
RegExp("^/" + ".*" + "/$").test(/hi/) /* test regexp literal via RegExp constructor */
RegExp("^/" + ".*" + "/$").test(RegExp("hi") ) /* test RegExp constructor via RegExp constructor */ 

delete RegExp("hi").source /* test via deletion of the source property */
delete /hi/.global /* test via deletion of the global property */
delete /hi/.ignoreCase /* test via deletion of the ignoreCase property */
delete RegExp("hi").multiline /* test via deletion of the multiline property */
delete RegExp("hi").lastIndex /* test via deletion of the lastIndex property */

Если строковый литерал ограничен разделителем обратной косой черты регулярного выражения, самопроверка регулярного выражения завершится неудачей.

Если Object.seal или Object.freeze выполняются для определенного пользователем объекта, и этот объект также имеет все вышеупомянутые свойства, оператор delete вернет ложное срабатывание.

Ссылки

0 голосов
/ 17 октября 2013

Нет абсолютного способа проверить это, пока лучший ответ -

var t = /^foo(bar)?$/i;
alert(t instanceof RegExp);//returns true

но у этого подхода есть один недостаток, и он вернет false, если объект регулярного выражения поступает из другого окна.

0 голосов
/ 02 декабря 2010

«Regexp» не является родным типом Javascript.Большинство из приведенных выше ответов расскажут вам, как выполнить вашу задачу, но не почему.Вот почему .

...