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#' ,分别依次匹配 '/#.*#/' 及 '/./' 对结果取反
显然可以得到分别的结果为 false 和 true
并且对 false 和 true 直接进行逻辑与 && 操作后可以得到结果为 false
但是对上述的两个正则匹配进行逻辑与操作后得到的结果居然是 true
这一反常现象是由于 exex() 导致的吗?
可是 exex() 匹配到结果返回数组,未匹配到结果返回 null
取反后与期望得到的布尔值是符合的,
但是为什么对两个布尔表达式直接逻辑与会出现 false && true === true 这种结果呢?
exec
/g
的 Regex 是有状态的。它会从上一次匹配结束的位置开始下一次匹配。所以
patt.exec('#1#')
第一次执行时 true,第二次执行就会变成 false,因为从第一次匹配结束的位置开始匹配,就不能成功匹配上了。