RegExp.exec() 在 Firefox 中反复调用时返回 null



我在Firefox 10和11中使用正则表达式函数exec()时遇到了问题。

当调用很多函数时,该函数的行为似乎不稳定。在正确的结果中,它也返回了很多null。从Safari 5.1.3,Chrome 18和上面提到的Firefox版本,我只能在Firefox中看到该问题。

我创建了一个JSFiddle来演示这个问题:http://jsfiddle.net/KSH3S/,来源:

var i, x = "";
for (i = 0; i < 10000; i++) {
    var matches = /foo/g.exec('sdkfjfooasdknal');
    x += matches + "<br>";
}
$('body').html(x);

在我的两个 Firefox 版本中,这将返回 40x foo、1x null、41x foo ,从那时起,它在每次调用时都会在这两者之间交换。

你遇到过这个吗?

这是 Firefox 中 JS 引擎中的一个错误,就像 jfriend00 所说的那样。 应该在火狐 12 中修复。 见 https://bugzilla.mozilla.org/show_bug.cgi?id=728021

这个问题与循环中正则表达式的隐式声明有关。 我的猜测是浏览器正在将其缓存在某个地方或以某种方式对此感到困惑。

如果你每次通过 for 循环显式创建一个新的正则表达式对象,那么 Firefox 就不再有这个问题了:

var x = "";
for (var i=0; i<10000; i++) {
    var re = new RegExp("foo", "g");
    var matches = re.exec( 'sdkfjfooasdknal' );
    x += matches+"<br>";
}
$('body').html( x );

http://jsfiddle.net/jfriend00/F49db/

而且,显式声明正则表达式的方式并不重要,因为此方法也有效:

var x = "";
for (var i=0; i<10000; i++) {
    var re = /foo/g;
    var matches = re.exec( 'sdkfjfooasdknal' );
    x += matches+"<br>";
}
$('body').html( x );

这只是部分解释。 如果你尝试这个小提琴,它似乎工作正常。所以问题或错误可能出在文字的正则表达式解析中? 我不确定,但可能是循环优化将文字与变量区别对待的东西。

这是小提琴代码:

var x = "";
for (var i=0; i<10000; i++) {
    var a='sdkfjfooasdknal';
    var b=/foo/g;
    var matches = b.exec(a);
    x += matches+"<br>";
}
$('body').html( x );​

更新:这是我试图迫使它脱离正常循环的东西,问题再次出现。这是小提琴 http://jsfiddle.net/xXYdF/。

var x = "";
i=200;
function reg(){
    var matches = /foo/g.exec('sdkfjfooasdknal');
    x += matches+"<br>";
}
    function run(){
  setTimeout(function(){
    if(i--){
      reg();
      run();
      $('body').html( x );
    }
  },10);
}
run();

最新更新