如果你不在RegExp()前面使用new而不是简单的RegExp(),是否有性能提升?

时间:2013-01-23 11:40:21

标签: javascript regex performance

我想替换字符串中所有出现的子字符串 以下两个例子之间会有什么区别吗?

var str='A horse walks into a bar and the bartender asks "Hey, why the long face?".';

str.replace(new RegExp('bar','g'),'restaurant');
// versus
str.replace(RegExp('bar','g'),'restaurant');

注意:
这是一个简化的示例,与上面不同,我需要使用RegExp而不是文字正则表达式来连接字符串。

2 个答案:

答案 0 :(得分:1)

阅读有关RegExp函数功能的规范:

  

<强> 15.10.3 The RegExp Constructor Called as a Function

     

如果pattern是[[Class]]内部属性为的对象R.   “RegExp”和标志未定义,然后返回R不变。 否则   调用标准的内置RegExp构造函数(15.10.4.1),就像使用   表达新的RegExp(模式,标志)并返回该对象   由该构造函数构造。

     

<强> 15.10.4 The RegExp Constructor

     

当RegExp作为新表达式的一部分被调用时,它是一个   构造函数:它初始化新创建的对象。

     

如果pattern是[[Class]]内部属性为的对象R.   “RegExp”和标志是未定义的,然后让P成为用于的模式   构造R并让F成为用于构造R的标志。如果模式是   一个对象R,其[[Class]]内部属性为“RegExp”,标志为   未定义,然后抛出TypeError异常。否则,让P成为   如果模式未定义则为空字符串,ToString(模式)   否则,如果标志未定义,则让F为空字符串   否则就是ToString(标志)。

     

[...并从模式构建正则表达式]

所以实际上没有区别。如果没有new,它可能会更慢,因为它需要检查R的类型,new它可能会更慢,因为有一个额外的new-expression而不是简单的函数调用。 / p>

我猜即使用一个例子的实际性能测量,你也不会发现差异。

答案 1 :(得分:0)

虽然函数调用this时我不确定RegEx函数的内部结构,但它将使用全局对象而不是新项。

性能方面它将是相同的,但是如果你使用多个正则表达式,它们可能会相互冲突,因为它将替换全局对象上的任何变量。

两种调用都不是首选方式,而是语法为: str.replace(/bar/g,'restaurant');

在示例的情况下 以下内容也适用:

var myRegex = /bar/g;
str.replace(myRegex,'restaurant');