tau*_*tau 133 javascript regex constructor typeof instanceof
反正有没有检测JavaScript对象是否是正则表达式?
例如,我想做这样的事情:
var t = /^foo(bar)?$/i;
alert(typeof t); //I want this to return "regexp"
Run Code Online (Sandbox Code Playgroud)
这可能吗?
谢谢!
编辑:谢谢你的所有答案.看来我有两个非常好的选择:
obj.constructor.name === "RegExp"
Run Code Online (Sandbox Code Playgroud)
要么
obj instanceof RegExp
Run Code Online (Sandbox Code Playgroud)
这两种方法的主要优点/缺点是什么?
再次感谢!
Cle*_*ton 176
您可以使用instanceof运算符:
var t = /^foo(bar)?$/i;
alert(t instanceof RegExp);//returns true
Run Code Online (Sandbox Code Playgroud)
事实上,这几乎与:
var t = /^foo(bar)?$/i;
alert(t.constructor == RegExp);//returns true
Run Code Online (Sandbox Code Playgroud)
请记住,作为RegExp不是原始数据类型,因此无法使用typeof可能是此问题的最佳选项的运算符.
但你可以使用上面的这个技巧或其他像鸭类型检查,例如,检查这样的对象是否具有任何重要的方法或属性,或者通过其内部类值(通过使用{}.toString.call(instaceOfMyObject)).
use*_*716 23
alert( Object.prototype.toString.call( t ) ); // [object RegExp]
Run Code Online (Sandbox Code Playgroud)
这是获取对象类的规范中提到的方法.
从ECMAScript 5,第8.6.2节对象内部属性和方法:
[[Class]]内部属性的值由此规范为每种内置对象定义.主机对象的[[Class]]内部属性的值可以是除"Arguments","Array","Boolean","Date","Error","Function","JSON"之一之外的任何String值.,"数学","数字","对象","RegExp"和"字符串".内部使用[[Class]]内部属性的值来区分不同类型的对象.请注意,除了通过Object.prototype.toString之外,此规范不提供程序访问该值的任何方法(参见15.2.4.2).
RegExp是第15.10节RegExp(RegularExpression)对象中规范中定义的一类对象:
RegExp对象包含正则表达式和关联的标志.
Joh*_*ica 14
给.constructor房产一个旋转:
> /^foo(bar)?$/i.constructor
function RegExp() { [native code] }
> /^foo(bar)?$/i.constructor.name
"RegExp"
> /^foo(bar)?$/i.constructor == RegExp
true
Run Code Online (Sandbox Code Playgroud)
Sea*_*ira 10
// Is the given value a regular expression?
_.isRegExp = function(obj) {
return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
};
Run Code Online (Sandbox Code Playgroud)