内联JavaScript正则表达式更快吗?

时间:2009-11-19 00:46:17

标签: javascript browser

使用RegExp对象或内联样式是否更好?为什么?

3 个答案:

答案 0 :(得分:12)

根据ES3规范,它们略有不同,因为文字语法(/regex/)将在初始扫描时创建单个RegExp对象:

  

正则表达式文字是一个   转换为a的input元素   RegExp对象(第15.10节)的时候   扫描。该对象已创建   在评估含有之前   程序或功能开始。评估   文字的产生引用   那个对象;它不会创造新的   对象

该规范中的错误已在ES4中得到确认:

  

在ES3中使用正则表达式文字   喜欢/ ab / mg表示一个唯一的   创建的RegExp对象   第一次遇到文字   在评估期间。在ES4中一个新的   每次 创建RegExp对象   文字在期间遇到   评价。

各种浏览器的实施方式各不相同。 Safari和IE按照ES4处理文字,但Firefox和Chrome似乎按照ES3对待它们。

在各种浏览器中尝试以下代码,您将看到我的意思:

function f() {
    return /abc/g.test('abc');
}

alert(f()); // Alerts true
alert(f()); // Alerts false in FF/Chrome

与:

相比
function f() {
    return RegExp('abc', 'g').test('abc');
}

alert(f()); // Alerts true
alert(f()); // Alerts true

注意,false会被警告,因为该函数仍在使用该函数的上一次调用的正则表达式,其lastIndex已更新,这意味着它将不再与字符串"abc"匹配


提示:实例化new不需要RegExp运算符。 RegExp()本身也是一样的......


有关ES3 / 4问题的更多信息:Regex/lastIndex - Unexpected behaviour

答案 1 :(得分:3)

“RegExp()方法允许您将搜索模式动态构造为字符串,并且在未提前知道模式时非常有用。” - http://www.javascriptkit.com/jsref/regexp.shtml

答案 2 :(得分:2)

根据J-P's answer 略有不同,有时可能很重要。 意图是:

var re = /\d+/;

与:

相同
var re = new RegExp("\\d+");

但奇怪的是,在Firefox / Chrome中它不是相当相同(正如他的多次使用有状态表达式的例子所示)。

所以,使用RegExp对象将是我的建议。并且是J-P的一个很好的发现。

话虽这么说,你必须使用RegExp而不是字面语法的主要情况是动态创建表达式,例如:

var s = "[asdf]+";
var re = new RegExp(":" + s + ":", "g");