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
我很困惑,谁能帮助理解:
- 为什么这两个布尔语句都计算为
true
或 false
而它们本来是相反的?
Chrome
和 Node.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
我有几行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
在计算两个布尔语句时有什么区别?
来自 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