内联JavaScript正则表达式是否更快?

内联JavaScript正则表达式是否更快?,javascript,browser,Javascript,Browser,使用RegExp对象还是内联样式更好?为什么呢?根据这一点,有一点差异,这有时可能很重要。目的是: var re = /\d+/; 与以下内容相同: var re = new RegExp("\\d+"); 但是,奇怪的是,在Firefox/Chrome中,情况并不完全相同(正如他的例子所示,有状态表达式被多次使用) 因此,我建议使用RegExp对象。J-P的一个极好的发现 话虽如此,您必须在文本语法上使用RegExp的主要情况是动态创建表达式,例如: var s = "[asdf]+";

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

根据这一点,有一点差异,这有时可能很重要。目的是:

var re = /\d+/;
与以下内容相同:

var re = new RegExp("\\d+");
但是,奇怪的是,在Firefox/Chrome中,情况并不完全相同(正如他的例子所示,有状态表达式被多次使用)

因此,我建议使用
RegExp
对象。J-P的一个极好的发现

话虽如此,您必须在文本语法上使用
RegExp
的主要情况是动态创建表达式,例如:

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

“RegExp()方法允许您将搜索模式动态构造为字符串,并且在模式事先未知时非常有用。”——

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

正则表达式文字是 转换为的输入元素 RegExp对象(第15.10节)在 被扫描。对象已创建 在评估包含 程序或功能开始。评价 的文本生成对的引用 该物体;它不会创建新的 反对

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

在ES3中,正则表达式文本 like/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”
匹配


提示:要实例化
RegExp
,不需要使用
new
运算符
RegExp()
本身的工作原理是相同的



有关ES3/4问题的更多信息:

必须有更多定义的差异。我问这个问题的动机是因为JSLint似乎不喜欢内联格式。不幸的是,我找不到一个可以理解的原因来解释为什么.JSLint不喜欢很多实际上完全相同的东西。请记住,JSLint是一个样式检查器,而不仅仅是一个语法检查器。Crockford先生很可能不赞成它,因为它可能很难理解或类似的东西。因此,你可以说使用内联表单会稍微更有效率(至少在ES3中是这样)。而RegExp表单将产生更一致的交叉实现结果。令人惊叹的!