Javascript布尔运算符混淆

时间:2018-10-17 02:29:29

标签: javascript node.js google-chrome boolean boolean-operations

我有几行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在评估这两个布尔语句之间有什么区别?

2 个答案:

答案 0 :(得分:1)

我认为这似乎不是一个答案,但是 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
>

enter image description here

我敢打赌,它来自于重新使用全局正则表达式。

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

答案 1 :(得分:0)

来自MDN(重点是我):

  

/users/def(或与其结合使用)一样,exec()被称为   全局正则表达式实例上的时间将提前   上一场比赛。

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

test()

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

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

注意:对于您问题中的代码,我在Node中得到的输出与在Chrome和Firefox中得到的输出相同:var str = '////'; var re = /^\/+$/; console.log(re.test(str)); // matches, "true" console.log(re.test(str)); // matches, "true"