Javascript :用'!'进行疯狂的布尔测试操作员

Javascript : Insane boolean test with '!' operator

将以下函数调用输入 chrome 控制台时:

(function(regex, str){
    console.log(regex.test(str))
    console.log(!regex.test(str))
    console.log(! regex.test(str))
    console.log( !regex.test(str))
    console.log( ! regex.test(str))
})(new RegExp("new", "gmi"), "new")

我得到以下结果:

true
true
false
true
false

谁能解释为什么第 3 次和第 5 次测试 return false? 为什么第一和第二都是 return true.

您包含了 "g" 修饰符,因此正则表达式对象会保持匹配进度的状态。每次调用都不一样,换句话说。

您的第一个调用匹配字符串 "new",并且正则表达式将位置更新为字符串的末尾。下一个匹配失败(因此您看到 true 对应 !regexp.test(str))。它失败是因为字符串 "new" 没有出现在字符串 "new".

的末尾

现在我们已经 运行 结束字符串,所以下一个测试像第一个一样重新开始。它再次匹配,因此您的 !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 属性 在 03 之间切换。

我认为这个故事的寓意是"don't use 'g' unless you really know you want to."

我会向您解释发生了什么。浏览评论。它的形式是

regex.lastIndex, actual value, negated value

// code below

(function(regex, str){
    console.log(regex.test(str)) // 0, true, false
    console.log(!regex.test(str)) // 3, false, true => lastIndex set to 0
    console.log(! regex.test(str)) // 0, true, false
    console.log( !regex.test(str)) // 3, false, true => lastIndex set to 0
    console.log( ! regex.test(str)) // 0, true, false
})(new RegExp("new", "gmi"), "new")

MDN

If lastIndex is equal to the length of the string and if the regular expression does not match the empty string, then the regular expression mismatches input, and lastIndex is reset to 0.

因此,lastIndex 已更新,以防多次使用全局正则表达式并决定从何处开始匹配。