用于正则表达式的 typeof

是否存在检测 JavaScript 对象是否为正则表达式的方法?

例如,我想做这样的事情:

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

这可能吗?

谢谢!

编辑: 谢谢你的回答。看来我有两个很好的选择:

obj.constructor.name === "RegExp"

或者

obj instanceof RegExp

这两种方法有什么优缺点吗?

再次感谢!

51932 次浏览

使用 google chrome:

x = /^foo(bar)?$/i;
x == RegExp(x); // true
y = "hello";
y == RegExp(y); // false

.constructor的属性试一试:

> /^foo(bar)?$/i.constructor
function RegExp() { [native code] }
> /^foo(bar)?$/i.constructor.name
"RegExp"
> /^foo(bar)?$/i.constructor == RegExp
true

来自 下划线 js

// Is the given value a regular expression?
_.isRegExp = function(obj) {
return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
};

“ Regexp”不是本机 Javascript 类型。上面的大部分答案告诉你如何完成你的任务,但没有告诉你为什么。这是 为什么

你可以使用 Instanceof操作员:

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

事实上,差不多和:

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

请记住,因为 正则表达式不是一个 基本数据类型基本数据类型,它是不可能使用的 typeof操作符,可以 是最好的选择为这个问题。

但是您可以使用上面的这个技巧或者其他类似于 鸭子类型检查的技巧,例如,检查这样的对象是否有任何重要的方法或属性,或者通过它的 内部等级价值内部等级价值(通过使用 {}.toString.call(instaceOfMyObject))。

alert( Object.prototype.toString.call( t ) ); // [object RegExp]

这是规范中提到的获取对象类的方法。

来自 ECMAScript 5,章节8.6.2对象内部属性和方法:

[[ Class ]]内部属性的值由此规范为每种内置对象定义。宿主对象的[[ Class ]]内部属性的值可以是除 “参数”、“数组”、“布尔”、“日期”、“错误”、“函数”、“ JSON”、“数学”、“数字”、“对象”、“正则表达式”和“字符串”之外的任何 String 值。[[ Class ]]内部属性的值在内部用于区分不同类型的对象。注意,除了通过 Object.Prototype.toString (参见15.2.4.2)之外,这个规范没有为程序提供任何访问该值的方法。

RegExp 是在 第15.10节 RegExp (正则表达式)对象的规范中定义的一类对象:

RegExp 对象包含正则表达式和相关标志。

目前还没有绝对的方法来验证这一点,到目前为止最好的答案是

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

但是这种方法有一个缺点,那就是如果正则表达式对象来自另一个窗口,它将返回 false。

这里有两种方法:

/^\/.*\/$/.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 */

如果字符串文字由 regexp 反斜杠分隔符分隔,regexp self 测试将失败。

如果在用户定义的对象上运行 Object.sealObject.freeze,并且该对象也具有上述所有属性,则 delete语句将返回假阳性。

参考文献

我正在寻找 typeof regex,因为我试图在 type definition中使用它的 TypeScript 道具的一个函数。

然后我做下一步:

const RegexType = /$/;


type paramProps = {
regexParam: typeof RegexType;
}

你可以在这里测试:

const RegexType = /$/;
const t = /^foo(bar)?$/i;


console.log(typeof t == typeof RegexType) //true