Почему эта точка с запятой приводит к неверному результату фальши

Странные результаты теста правды

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)
Другие вопросы по тегам