Это обычное поведение, когда вы работаете с шаблонами, имеющими глобальный флаг g
, и используете методы exec
или test
.
В этом случае объект RegExp
будет отслеживать lastIndex
, где было найдено совпадение, и затем при последующих совпадениях он будет начинаться с этого lastIndex
вместо того, чтобы начинаться с 0.
Редактировать: В ответ на ваш комментарий почему не воссоздается объект RegExp
при повторном вызове функции :
Это поведение, описанное для литералов регулярных выражений , позвольте мне процитировать спецификацию:
& секта; 7.8.5 - Литералы регулярного выражения
...
Объект создается до начала оценки содержащейся программы или функции. Оценка литерала дает ссылку на этот объект; это не создает новый объект.
....
Вы можете сделать простое доказательство:
function createRe() {
var re = /foo/g;
return re;
}
createRe() === createRe(); // true, it's the same object
Вы можете быть уверены, что это один и тот же объект, потому что "два литерала регулярного выражения в программе оцениваются как объекты регулярного выражения, которые никогда не сравниваются как ===
друг с другом, даже если содержимое двух литералов одинаково" , например:
/foo/ === /foo/; // always false...
Однако это поведение соблюдается во всех браузерах, кроме IE, который каждый раз инициализирует новый объект RegExp.