Вы включаете модификатор «g», поэтому объект регулярного выражения поддерживает состояние выполнения совпадения. Другими словами, каждый вызов не совпадает.
Ваш первый вызов соответствует строке "new"
, а регулярное выражение обновляет позицию до конца строки. Следующий матч не удастся (так что вы видите true
за !regexp.test(str)
). Он терпит неудачу, потому что строка «новый» не появляется в конце строки «новый».
Теперь мы сбегаем с конца строки, поэтому следующий тест начинается как первый. Он снова совпадает, поэтому ваш !
превращает это true
в false
. Тот, который после этого не соответствует, и один после , что начнется снова и будет соответствовать.
Обратите внимание, что пробелы вокруг !
в тестах не имеют абсолютно никакого отношения к поведению.
редактировать — попробовать этот вариант:
(function(regex, str){
console.log(regex.test(str) + " - " + regex.lastIndex)
console.log(!regex.test(str) + " - " + regex.lastIndex)
console.log(! regex.test(str) + " - " + regex.lastIndex)
console.log(!regex.test(str) + " - " + regex.lastIndex)
console.log(! regex.test(str) + " - " + regex.lastIndex)
})(new RegExp("new", "gmi"), "new")
Вы увидите, что .lastIndex
свойство позволяет переключаться между 0
и 3
.
Я думаю, что мораль этой истории «не используйте 'g'
, если вы действительно не знаете, чего хотите».
более запутанным является то, как первые два обеспечивают тот же результат – DLeh
@DLeh Я вытягиваю свои волосы. Реплицировать этот результат практически невозможно. –
@JoeButler, если вы выберете модификатор «g», он больше не будет странным. – Pointy