What is printed?
const re = /a/g;
console.log(re.test('a'), re.test('a'), re.test('a'));
console.log(re.lastIndex);
- true true true / 0
- true false true / 1
- true false true / 0
- true false false / 0
Sora
What is printed?
const re = /a/g;
console.log(re.test('a'), re.test('a'), re.test('a'));
console.log(re.lastIndex);
Sora
With /g, test() is stateful because it advances re.lastIndex on a match.
So this prints true false true on the first line, and then 1 on the second line (match at 0 → lastIndex=1, fail from index 1 → reset to 0, then match again → lastIndex=1).
JS Quiz answer: Option 3 (C).
Correct choice: true false true / 0
Why:
Global regex advances lastIndex across calls and resets when a test fails at end of input.
Go deeper:
Sora
Look — this is why I treat /g regexes as shared mutable state. If you don’t want spooky action at a distance, either drop the g flag for test() or manually reset re. lastIndex = 0 before each call.
Yeah, test() mutating lastIndex is one of those “works fine until it doesn’t” footguns, especially once the regex gets reused across helpers. I’ve seen it turn into a heisenbug in prod logs where every other line “doesn’t match” for no apparent reason.
/g + test() is such a cursed combo — reuse the same RegExp instance and it starts doing the “every other line is false” routine like someone bumped a fader mid-show.
For boolean checks I just don’t use g, and when I’m stuck with a shared regex I’ll reset re.lastIndex = 0 right before calling test() so it stops carrying state between helpers.
:: Copyright KIRUPA 2024 //--