Javascript文本regexp vs regexp对象,循环内的实例

Javascript文本regexp vs regexp对象,循环内的实例,javascript,regex,Javascript,Regex,我有以下两个js示例代码,一个使用文本regexp,另一个使用regexp对象: "use strict"; var re; // literal regexp for(var i = 0; i<10; i++) { re = /cat/g; console.log(re.test("catastrophe")); } // RegExp constructor for(var i = 0; i<10;i++) { re = new RegExp("c

我有以下两个js示例代码,一个使用文本regexp,另一个使用regexp对象:

"use strict";

var re;


// literal regexp
for(var i = 0; i<10; i++)
{
    re = /cat/g;
    console.log(re.test("catastrophe"));
}

// RegExp constructor
for(var i = 0; i<10;i++)
{
    re = new RegExp("cat", "g");
    console.log(re.test("catastrophe"));
}
“严格使用”;
var-re;
//文字正则表达式

对于(var i=0;i在这两种情况下,您每次都是通过
for
循环创建一个新的RegExp。无论您以何种方式声明RegExp,每次循环迭代时它仍然会创建一个新的RegExp。因此,您会得到相同的行为


现在,如果您在
for
循环之前初始化
re
变量,您将获得不同的行为,因为同一个RegExp对象的持久性以及它如何使用
g
标志。

在这两种情况下,您每次都是通过
for
循环创建一个新的RegExp。使用哪种方式都无关紧要eclare是RegExp——每次循环迭代时,它仍在创建一个新的RegExp。因此,您会得到相同的行为


现在,如果在
for
循环之前初始化
re
变量,您将获得不同的行为,因为同一个RegExp对象的持久性以及它如何使用
g
标志。

第三版ECMAScript(JavaScript)规范允许缓存和重用正则表达式文本,包括它们的状态,从而导致“意外”您在第一个代码示例中提到的行为,看起来它应该在每个循环上创建一个新的正则表达式对象。大多数引擎都没有实现文本缓存,这是一个非常糟糕的想法,第五版规范对此进行了修复

我相信所有用于缓存的现代引擎(主要是SpiderMonkey,Firefox的引擎)都得到了相应的更新

,并在:

7.8.5:正则表达式文本现在在每次计算该文本时都返回一个唯一的对象。任何测试此类文本值的对象标识或对共享副作用敏感的程序都可以检测到这种变化


第三版ECMAScript(JavaScript)规范允许缓存和重用正则表达式文本,包括它们的状态,从而导致“令人惊讶的”您在第一个代码示例中提到的行为,看起来它应该在每个循环上创建一个新的正则表达式对象。大多数引擎都没有实现文本缓存,这是一个非常糟糕的想法,第五版规范对此进行了修复

我相信所有用于缓存的现代引擎(主要是SpiderMonkey,Firefox的引擎)都得到了相应的更新

,并在:

7.8.5:正则表达式文本现在在每次计算该文本时都返回一个唯一的对象。任何测试此类文本值的对象标识或对共享副作用敏感的程序都可以检测到这种变化


因此,如果我不需要IE8,我可以使用这两种形式中的任何一种?@tudorraviu:IE8不是缓存它们的引擎之一,所以也可以。在这里试试:我认为它主要是SpiderMonkey(Firefox的引擎),它早就被修复了。所以如果我不需要IE8,我可以使用这两种形式中的任何一种?@tudorraviu:IE8不是缓存它们的引擎之一,所以它也很好。试试这里:我认为它主要是SpiderMonkey(Firefox的引擎),它早就被修复了。从ES5开始,现在都是这样。ES3有一个奇怪的“缓存”概念只有一个或两个引擎实现过的文本,导致OP在第一个循环中描述的行为。从ES5开始,现在都是这样。ES3有一个奇怪的“缓存”文本概念,只有一个或两个引擎实现过,导致OP在第一个循环中描述的行为。