正则表达式/lastIndex - 意外行为

5

我知道有一些正则表达式/lastIndex的差异,但这个是新的!

期望行为:创建一个新的正则表达式(使用文字/构造函数)将会创建一个新的RegExp对象,并将lastIndex属性设置为零。

实际行为:(在Firefox和Chrome中)lastIndex属性似乎会持续存在于多个RegExp创建中。

例如:

function foo(s) {

    // A *NEW* regular expression
    // is created on each call of foo():
    var regex = /ABC/g;

    document.write( regex.lastIndex + '<br/>' );

    // regex.test() updates lastIndex property
    regex.test(s);

    // This is where the regex's life should end...
    // (Why does it persist?)

}

foo('ABC');
foo('ABCABC');
foo('ABCABCABC');

请查看这里:http://jsbin.com/otoze


每次函数调用都会创建一个新的RegExp对象(是吗?),那么为什么下面的内容会被写入文档中?? -

0
3
6

注意,这种奇怪的现象似乎只发生在Firefox(3)和Chrome(2)中,但是令人好奇的是IE没有出现这种情况。

这是预期行为吗?IE是对的还是错的?这是一个众所周知的错误吗?


编辑:当使用构造函数而不是字面量实例化正则表达式时,似乎不会发生这种情况。例如:new RegExp('ABC','g'); ... 不过,理论上字面量应该也能工作,对吧?

2个回答

5

var regex = new RegExp("ABC", "g");没有这个问题,所以我猜/ABC/g会重用正则表达式对象。

编辑:根据ECMAScript 3.0规范,这是正确的行为,它在ECMAScript 3.1中得到了修复 - 详情


@J-P:这并不奇怪,你从未使用过 new 关键字。 - Chris
奇怪的是,如果您在函数中多次调用相同的代码,则会返回正确的输出。它几乎看起来像是在后续调用相同函数时错误地优化了一些赋值操作。 - Lukáš Lalinský
1
@Chris,据我所知,那应该是隐式的...毕竟这就是字面量的作用... - James
@Lukas,感谢你提供的链接!我很高兴这个问题已经在ES规范中得到解决。 - James
1
显然这是ECMAScript规范中已知的问题 - http://www.mail-archive.com/es-discuss@mozilla.org/msg01796.html - Lukáš Lalinský

1

试试这个:

function foo(s) {

    // A *NEW* regular expression
    // is created on each call of foo():
    var regex = new RegEx("ABC", "g");

    document.write( regex.lastIndex + '<br/>' );

    // regex.test() updates lastIndex property
    regex.test(s);

    // This is where the regex's life should end...
    // (Why does it persist?)

}

foo('ABC');
foo('ABCABC');
foo('ABCABCABC');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接