Javascript 布尔运算符混淆

Javascript Boolean Operator Confusion

我有几行javascript代码如下:

var str = '////';
var re = /^\/+$/g 
console.log(str && re.test(str), str && !re.test(str)); 

Node.js 中代码的输出是 false, false 而在 Chrome 客户端中是 true, true

我很困惑,谁能帮助理解:

  1. 为什么这两个布尔语句都计算为 truefalse 而它们本来是相反的?
  2. ChromeNode.js 在计算两个布尔语句时有什么区别?

来自 MDN(强调我的):

As with exec() (or in combination with it), test() called multiple times on the same global regular expression instance will advance past the previous match.

因此,由于您的正则表达式是全局的,因此会发生以下情况:

var str = '////';
var re = /^\/+$/g;

console.log(re.test(str)); // "true" — matches and regex advances
console.log(re.test(str)); // "false" — remainder no longer matches

相比之下,对于非全局表达式:

var str = '////';
var re = /^\/+$/;

console.log(re.test(str)); // matches, "true"
console.log(re.test(str)); // matches, "true"

注意:对于您问题中的代码,我在 Node 中得到的输出与在 Chrome 和 Firefox 中得到的输出相同:true true.

我觉得好像不是答案,但是Node.js特此输出:

true true

这是一个终端控制台。

PS E:\DevRoom\Kindy> node
> str = '////'
'////'
> re = /^\/+$/g
/^\/+$/g
> console.log(str && re.test(str), str && !re.test(str))
true true
undefined
>

我敢打赌这是因为重新使用了全局正则表达式。

var regex1 = RegExp('foo*');
var regex2 = RegExp('foo*','g');
var str1 = 'table football';

console.log(regex1.test(str1));
// expected output: true

console.log(regex1.test(str1));
// expected output: true

console.log(regex2.test(str1));
// expected output: true

console.log(regex2.test(str1));
// expected output: false