类型of for RegExp

有没有检测JavaScript对象是否是正则表达式?

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

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

这可能吗?

谢谢!

编辑:感谢所有的答案。看来我有两个非常好的选择:

obj.constructor.name === "RegExp"

obj instanceof RegExp

这两种方法有什么主要的利弊吗?

再次感谢!


答案 1

您可以使用运算符的实例

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)


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

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

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

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

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

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