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 - 意外行为