Является ли 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;