无论如何检测JavaScript对象是否是正则表达式?
例如,我想做这样的事情:
var t = /^foo(bar)?$/i;
alert(typeof t); //I want this to return "regexp"
这可能吗?
谢谢!
编辑:感谢所有答案。看来我有两个非常好的选择:
obj.constructor.name === "RegExp"
或
obj instanceof RegExp
这两种方法的主要优点/缺点是什么?
再次感谢!
答案 0 :(得分:169)
您可以使用 instanceof 运算符:
var t = /^foo(bar)?$/i;
alert(t instanceof RegExp);//returns true
事实上,几乎与相同:
var t = /^foo(bar)?$/i;
alert(t.constructor == RegExp);//returns true
请注意,由于 RegExp 不是primitive data type,因此无法使用typeof
运算符be the best option来解决此问题。
但你可以使用上面的这个技巧或其他像 duck type检查,例如,检查这样的对象是否有任何重要的方法或属性,或者它的内部类值(使用{}.toString.call(instaceOfMyObject)
)。
答案 1 :(得分:22)
alert( Object.prototype.toString.call( t ) ); // [object RegExp]
这是获取对象类的规范中提到的方法。
来自 ECMAScript 5,第8.6.2节“对象内部属性和方法”:
[[Class]]内部属性的值由此规范为每种内置对象定义。主机对象的[[Class]]内部属性的值可以是除“Arguments”,“Array”,“Boolean”,“Date”,“Error”,“Function”之一之外的任何String值, “JSON”,“Math”,“Number”,“Object”,“RegExp”和“String”。内部使用[[Class]]内部属性的值来区分不同类型的对象。请注意,除了通过Object.prototype.toString之外,此规范不提供程序访问该值的任何方法(参见15.2.4.2)。
RegExp是第15.10节RegExp(RegularExpression)对象中规范中定义的一类对象:
RegExp对象包含正则表达式和关联的标志。
答案 2 :(得分:13)
给.constructor
属性一个旋转:
> /^foo(bar)?$/i.constructor
function RegExp() { [native code] }
> /^foo(bar)?$/i.constructor.name
"RegExp"
> /^foo(bar)?$/i.constructor == RegExp
true
答案 3 :(得分:10)
// Is the given value a regular expression?
_.isRegExp = function(obj) {
return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
};
答案 4 :(得分:3)
适用于Google Chrome:
x = /^foo(bar)?$/i;
x == RegExp(x); // true
y = "hello";
y == RegExp(y); // false
答案 5 :(得分:0)
“Regexp”不是原生Javascript类型。上面的大多数答案都告诉你如何完成你的任务,但不是为什么。这是why。
答案 6 :(得分:0)
没有绝对的方法来检查这个,到目前为止最好的答案是
var t = /^foo(bar)?$/i;
alert(t instanceof RegExp);//returns true
但是这种方法有一个缺点,如果正则表达式对象与另一个窗口相符,它将返回false。
答案 7 :(得分:0)
以下是两种方式:
/^\/.*\/$/.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 test将失败。
如果Object.seal
或Object.freeze
在用户定义的对象上运行,并且该对象也具有上述所有属性,则delete
语句将返回误报。
<强>参考强>