我想替换字符串中所有出现的子字符串 以下两个例子之间会有什么区别吗?
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而不是文字正则表达式来连接字符串。
答案 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');