Почему эта точка с запятой приводит к неверному результату фальши
Странные результаты теста правды
filter = /rob/gi
>> /rob/gi
filter.test('hey')
>> false
filter.test('rob')
>> true
true && filter.test('rob');
>> false
true && filter.test('rob') ;
>> true
(true && filter.test('rob'));
>> false
(true && filter.test('rob')) ;
>> true
Воспроизводимый в Firefox и Chrome
1 ответ
Решение
Это потому что .test
ведет себя как .exec()
и поддерживает состояние (положение) между вызовами
Как и в случае с exec() (или в сочетании с ним), test(), вызываемый несколько раз в одном и том же глобальном экземпляре регулярного выражения, будет проходить после предыдущего совпадения.
Так что для 'rob'
введите его соответствует. Затем при втором вызове он пытается найти совпадение с тем, что осталось после первого совпадения: это пустая строка, поэтому происходит сбой и перематывание.
Чтобы увидеть это в действии, попробуйте подобрать 'robrobrob'
- будет 3 true
с последующим false
,
Рекомендации:
UPD:
- В данном конкретном случае это происходит потому, что вы используете
g
модифицировано (кредиты Barmar)