关于正则匹配导致的布尔表达式false && true === true是什么原因引起的?

let patt = /#.*#/g
const validateDot = (str) => {
  const reg = /\./
  return reg.test(str)
}
console.log(!patt.exec('#1#'))
console.log(!validateDot('#1#'))
console.log(false && true)
console.log(!patt.exec('#1#') && !validateDot('#1#'))

对于一个字符串 '#1#' ,分别依次匹配 '/#.*#/''/./' 对结果取反
显然可以得到分别的结果为 falsetrue
并且对 falsetrue 直接进行逻辑与 && 操作后可以得到结果为 false
但是对上述的两个正则匹配进行逻辑与操作后得到的结果居然是 true
image.png

这一反常现象是由于 exex() 导致的吗?
可是 exex() 匹配到结果返回数组,未匹配到结果返回 null
取反后与期望得到的布尔值是符合的,
但是为什么对两个布尔表达式直接逻辑与会出现 false && true === true 这种结果呢?

阅读 2.1k
1 个回答

exec

JavaScript RegExp objects are stateful when they have the global or sticky flags set (e.g. /foo/g or /foo/y). They store a lastIndex from the previous match. Using this internally, exec() can be used to iterate over multiple matches in a string of text (with capture groups), as opposed to getting just the matching strings with String.prototype.match().

/g 的 Regex 是有状态的。它会从上一次匹配结束的位置开始下一次匹配。

所以 patt.exec('#1#') 第一次执行时 true,第二次执行就会变成 false,因为从第一次匹配结束的位置开始匹配,就不能成功匹配上了。

推荐问题