Является ли JavaScript-тест() сохранением состояния в регулярном выражении?
Откройте консоль браузера и выполните следующий код:
var foo = /foo/g;
Затем
foo.test("foo") // true
Затем
foo.test("foo") // false
Если вы продолжите выполнение foo.test( "foo" ), вы увидите переменные истинные/ложные ответы, как если бы var foo фактически был изменен.
Кто-нибудь знает, почему это происходит?
Ответы
Ответ 1
Да, как работают .test()
и .exec()
, когда регулярное выражение g
глобально. Они начинаются в конце последнего матча.
Вы можете наблюдать текущий последний индекс объекта регулярного выражения, используя свойство .lastIndex
.
Это свойство записи, поэтому вы можете reset его на 0
, когда/если вам нужно. Когда регулярное выражение выполняется без поиска совпадения, оно автоматически сбрасывается до 0
.
Ответ 2
Регулярное выражение сохраняет позицию последнего теста. Это позволяет искать длинные строки. Вы можете reset установить значение lastIndex = 0;