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