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

Dmi*_*rba 7 javascript browser

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

Jam*_*mes 13

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

正则表达式文字是一个输入元素,在扫描时会转换为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
Run Code Online (Sandbox Code Playgroud)

和....相比:

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

alert(f()); // Alerts true
alert(f()); // Alerts true
Run Code Online (Sandbox Code Playgroud)

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


提示:new不需要运算符RegExp进行实例化.RegExp()本身的作用相同......


有关ES3/4问题的更多信息:Regex/lastIndex - 意外行为