用于RegExp的typeof

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)).

  • 此外,当从另一个窗口测试正则表达式对象时,`t instanceof RegExp`将报告false,如果不需要这种检查,这将不会成为问题,但需要注意. (13认同)
  • 这两个代码片段不完全相同.如果你插入了`t.constructor = function(){};`,这是完全合法的,那么`t instanceof RegExp`仍然是真的但是`t.constructor == RegExp`将是假的.因此优选使用`instanceof`. (11认同)

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对象包含正则表达式和关联的标志.

  • @Tim - 我很确定.不是它的保证,但它是[jQuery使用的方法](https://github.com/jquery/jquery/blob/master/src/core.js#L504-508),包括[RegExp](https) ://github.com/jquery/jquery/blob/master/src/core.js#L821-823).我将使用RegExp在IE6中进行快速测试,它确实有效(如果这是任何指标).:o)看起来好像这个方法已经成为第3版的规范. (4认同)
  • 除了鸭子打字,这是令人恼火的不精确,这仍然是最好的答案. (3认同)

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)

  • `constructor`属性可以更改.`instanceof`没有这个问题,是一个更好的解决方案. (4认同)
  • +1你每天都在学习新的做事方式!谢谢! (2认同)

Sea*_*ira 10

来自underscore.js

// 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)

  • 下划线现在使用`Object.prototype.toString.call(obj)=='[object RegExp]'` (5认同)
  • 现在我知道:在从其他窗口检查对象时,它在IE中不起作用. (3认同)