11

次の JavaScript を見てください。私はそれから何かを取り出したので、問題の本質に集中することができます.

prepPath 関数を続けて 2 回呼び出して、まったく同じ文字列を渡していることがわかります。Firefox と IE8 では、この関数は (予想どおり) 毎回 true をアラートします。しかし、Chromium 5.0.375.127 (55887) Ubuntu 10.04 では、関数は最初の呼び出しで true を返し、2 回目の呼び出しで 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で2回目に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 に答える