Вебсправочник
Ваш первый сайт

Урок: почему test() чередует true и false

Повторная проверка одной строки может дать разные результаты, если используется глобальное регулярное выражение. Причина часто находится в lastIndex, а не в изменении исходного текста.

Назначение

Повторная проверка одной строки может дать разные результаты, если используется глобальное регулярное выражение. Причина часто находится в lastIndex, а не в изменении исходного текста.

Как это работает

В учебном файле создайте один RegExp с флагом g и вызовите test несколько раз. Выводите рядом текущую позицию. Затем сравните с выражением без глобального режима, если нужен только логический ответ о наличии совпадения.

Пример

const globalPattern = /a/g;
for (let step = 0; step < 3; step += 1) {
  console.log(globalPattern.test("a"), globalPattern.lastIndex);
}
const simplePattern = /a/;
console.log(simplePattern.test("a"), simplePattern.test("a"));

Что должно получиться

Первый глобальный поиск успешен и продвигает позицию, второй не находит следующего совпадения и сбрасывает её. Третий снова начинает с нуля. Выражение без g не создаёт такую последовательность в данном примере.

Граница применения и частая ошибка

Не переиспользуйте stateful-выражение без понимания между независимыми проверками разных полей. Случайный сброс lastIndex может скрыть ошибку проектирования. Если нужен перебор совпадений, сохраняемое состояние полезно; если только проверка формата, g часто лишний.

Самостоятельная проверка

Повторите опыт для строки aa и запишите все позиции. Затем уберите g и сравните. Сформулируйте, где нужен отдельный объект на операцию, а где разумнее использовать неглобальное выражение.

Самостоятельный учебный материал. Техническая документация: первоисточник по теме ↗. Если результат отличается, проверьте код и версию браузера.