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