【问题标题】:Javascript Boolean Operator ConfusionJavascript布尔运算符混淆
【发布时间】:2018-10-17 02:29:29
【问题描述】:

我有几行javascript代码如下:

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

Node.js 中的代码输出为false, falseChrome 客户端为true, true

我很困惑,有人能帮忙理解吗:

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

【问题讨论】:

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


【解决方案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
>

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

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

【讨论】:

  • 谢谢。确实是这个原因。抱歉,我无法将您的帖子标记为答案,因为其他帖子的发布时间早于您的帖子。
  • 没关系,谢谢。顺便说一句,无论如何你都可以投票给我 ͡⚆ ͜ʖ ͡⚆
  • 你太棒了!
【解决方案2】:

来自MDN(强调我的):

exec()(或与其结合)一样,test() 称为多个 同一个 global 正则表达式实例上的时间将提前过去 上一场比赛。

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

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

【讨论】:

  • 谢谢!这就解释了。我在节点中得到false false 的原因是因为我的原始代码在两个 && 运算符之前记录了 re.test(str)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
  • 2018-04-01
  • 2012-09-15
  • 2011-09-19
  • 1970-01-01
相关资源
最近更新 更多