Javascript Boolean Operator Confusion - PullRequest
       7

Javascript Boolean Operator Confusion

0 голосов
/ 17 октября 2018

У меня есть несколько строк кода JavaScript, как показано ниже:

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

Вывод кода в Node.js равен false, false и Chrome На стороне клиента true, true

Я совершенно сбит с толку, и поможет ли кто-нибудь понять:

  1. Почему оба логических выражения оцениваются как true или false, тогда как предполагается, что они противоположны?
  2. В чем разница между Chrome и Node.js в оценке двух логических выражений?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Я думаю, что это не похоже на ответ, но 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
0 голосов
/ 17 октября 2018

С 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.

...