-1

我想替换字符串中所有出现的子字符串。
下面两个例子会有什么不同吗?

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 而不是文字正则表达式来连接字符串。

4

2 回答 2

1

阅读有关该RegExp功能的功能的规范:

15.10.3 作为函数调用的 RegExp 构造函数

如果 pattern 是 [[Class]] 内部属性为 "RegExp" 且 flags 未定义的对象 R,则返回 R 不变。否则调用标准的内置 RegExp 构造函数 (15.10.4.1),就好像通过表达式 new RegExp(pattern, flags) 并返回由该构造函数构造的对象。

15.10.4 正则表达式构造函数

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

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

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

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

我猜即使使用示例的实际性能测量,您也不会注意到差异。

于 2013-01-23T11:59:55.777 回答
0

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

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

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

在示例的情况下,以下内容也将起作用:

var myRegex = /bar/g;
str.replace(myRegex,'restaurant');
于 2013-01-23T11:53:17.863 回答