【发布时间】:2019-04-13 01:58:00
【问题描述】:
我在 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,然后每次调用都会在这两者之间进行交换。
你遇到过吗?
【问题讨论】:
-
如果使用 same 正则表达式对象调用会发生什么? (例如
var foo = /foo/g在循环外) -
您真正想解决什么问题?对带有“g”标志的正则表达式重复调用
exec()会累积从一次调用到下一次调用的某些状态,以便您在同一源字符串中找到多个匹配项。 -
@jfriend00 但在这种情况下它是一个 new 正则表达式对象,即使 是 的情况,它也应该是一个可预测的模式。问题是 FF 行为不规律。
-
@pst - 你确定这是一个新的正则表达式对象吗? JS 有函数作用域,而不是块作用域。
-
@jfriend00 变量的作用域是函数。对象不是。
/foo/g构造一个新的 RegExp 对象,就像"foo"构造一个新的字符串对象一样。除非当然有一些“有趣的缓存”正在进行(也许在第 80 次这样的 RegExp 构造之后?)。无论如何,仍然不能解释不稳定的行为:-)
标签: javascript regex firefox