RegExp的typeof

2020/11/13 10:22 · javascript ·  · 0评论

无论如何,有没有检测JavaScript对象是否为正则表达式?

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

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

这可能吗?

谢谢!

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

obj.constructor.name === "RegExp"

要么

obj instanceof RegExp

任何一种方法的主要利弊?

再次感谢!

您可以使用instanceof运算符:

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))来检查。

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

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

ECMAScript 5开始,第8.6.2节“对象内部属性和方法”

此规范为每种内置对象定义[[Class]]内部属性的值。主机对象的[[Class]]内部属性的值可以是任何字符串值,但“ Arguments”,“ Array”,“ Boolean”,“ Date”,“ Error”,“ Function”,“ JSON”之一除外,“ Math”,“ Number”,“ Object”,“ RegExp”和“ String”[[Class]]内部属性的值在内部用于区分不同种类的对象。请注意,该规范不提供任何程序通过Object.prototype.toString(请参阅15.2.4.2)来访问该值。

RegExp是在规范15.15 RegExp(RegularExpression)Objects中定义的一类对象

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

.constructor旋转一下属性:

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

来自underscore.js

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

适用于谷歌浏览器:

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

“ Regexp”不是本机Javascript类型。上面的大多数答案都告诉您如何完成任务,而不是为什么。这就是为什么

没有绝对的方法可以检查,到目前为止最好的答案是

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自检将失败。

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

参考文献

本文地址:http://javascript.askforanswer.com/regexpdetypeof.html
文章标签: ,   ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!