Подтвердить что ты не робот

Chrome V8 Bug? Функция, действующая по-разному после того, как ее называют второй раз

Пожалуйста, взгляните на следующий JavaScript. Я взял материал из него, поэтому вы можете сосредоточиться на сути проблемы.

Вы заметите, что я дважды вызываю функцию prepPath в строке, передавая ее в той же строке. В firefox и IE8 эта функция каждый раз предупреждает об истинности (как и ожидалось). Но в 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?

4b9b3361

Ответ 1

Там какая-то двусмысленность в спецификации о том, когда литералы регулярных выражений должны получить reset (напомним, что они имеют состояние). Вы можете обойти это, сделав следующее:

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, некоторые версии других браузеров также имеют аналогичную проблему.