我有几行JavaScript代码,如下所示:
var str = '////';
var re = /^\/+$/g
console.log(str && re.test(str), str && !re.test(str));
Node.js
中代码的输出为false, false
,而Chrome
客户端中的代码输出为true, true
我很困惑,任何人都可以帮助理解:
true
或false
呢? Chrome
和Node.js
在评估这两个布尔语句之间有什么区别? 答案 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
>
我敢打赌,它来自于重新使用全局正则表达式。
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"
。