11

请看下面的 JavaScript。我已经从中提取了一些东西,因此您可以专注于问题的本质。

您会注意到我连续两次调用 prepPath 函数,传入完全相同的字符串。在 Firefox 和 IE8 中,此函数每次都会提示 true(如预期的那样)。但是,在 Chromium 5.0.375.127 (55887) Ubuntu 10.04 中,该函数第一次返回 true,第二次调用返回 false,尽管输入保持完全相同!

<script type="text/javascript"> 
    function prepPath(str)
    {   
        var regX = /[^\s/"'\\].*[^\s/"'\\]/g;
        if(regX.test(str))
        {
            alert("true: " + str);
        }
        else
        {
            alert("false; " + str);
        }
    }

    prepPath("/desktop"); // alerts: true
    prepPath("/desktop"); // alerts: false 
</script> 

为什么它在 Chromium 中第二次返回 false?

4

1 回答 1

14

规范中关于何时应该重置文字正则表达式存在一些歧义(回想一下它们有状态)。您可以通过以下方式解决此问题:

var regX = new RegExp(/[^\s/"'\\].*[^\s/"'\\]/g);

现场示例:http: //jsbin.com/irate

或这个:

var regX = /[^\s/"'\\].*[^\s/"'\\]/g;
regX.lastIndex = 0;

现场示例:http: //jsbin.com/irate/2

那些比我研究得更多的人告诉我,这实际上不是一个彻底的错误,而是一个模棱两可的问题。而且不只是 Chrome,其他浏览器的某些版本也有类似的问题。

于 2010-09-13T18:02:02.537 回答