Почему метод JavaScript RegExp.test() работает как переключатель?

Может кто-нибудь объяснить, почему стрелка alert() в следующем JavaScript-коде? Кажется, это ошибка в методе RegExp.test(), которая отменяет свое предыдущее решение каждый раз, когда вы запускаете метод. Я использую IE7.

Я нашел замену, которая кажется твердой, вместо этого используется метод string.search(regex). Но мне любопытно, знает ли кто-нибудь об этом.

  var styleHasWidthRegex = /\bwidth\s*\:/ig;
  var styleText = "WIDTH: 350px";
  var result1 = styleHasWidthRegex.test(styleText);
  var result2 = !styleHasWidthRegex.test(styleText);
  if (result1 == result2) {
    alert("This should never happen!");
  }

Ответы

Ответ 1

В вашем регулярном выражении установлен глобальный флаг (g). Каждый раз, когда он выполняется, он обновляет внутренний индекс (свойство lastIndex), указывающее, где оно остановилось, и начните поиск в это точка в следующий раз.

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

См. также: Несоответствующее логическое поведение javascript

Ответ 2

В этом случае вам всегда нужен глобальный тег, так как в объявлениях css свойство должно быть объявлено только один раз.