Ошибка Chrome V8?Функция действует иначе после вызова во второй раз - PullRequest
11 голосов
/ 13 сентября 2010

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

Вы заметите, что я вызываю функцию prepPath дважды подряд, передавая одну и ту же строку. В Firefox и IE8 эта функция каждый раз выдает предупреждение true (как и ожидалось). Но в Chromium 5.0.375.127 (55887) Ubuntu 10.04 функция возвращает true в первый раз и false во 2-м вызове, несмотря на то, что ввод остается неизменным!

<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> 

Почему он возвращает false во второй раз в Chromium?

1 Ответ

14 голосов
/ 13 сентября 2010

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

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

...