使用RegExp对象或内联样式是否更好?为什么?
答案 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");