Javascript Boolean Operator Confusion

1

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

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

Результатом кода в Node.js являются false, false и в стороне Chrome Client - true, true

Я очень смущен, и кто-нибудь поможет понять:

  1. Почему два логических оператора оцениваются как true или false то время как они должны быть противоположными?
  2. Какая разница между Chrome и Node.js при оценке двух булевых операторов?
  • 1
    Код в Node кажется мне true и true для меня
  • 0
    Уверен, что ваша проблема связана с повторным использованием глобального регулярного выражения
Показать ещё 1 комментарий
Теги:
google-chrome
boolean
boolean-operations

2 ответа

0
Лучший ответ

Из MDN (акцент мой):

Как и в случае с 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

Для сравнения, для неглобального выражения:

var str = '////';
var re = /^\/+$/;

console.log(re.test(str)); // matches, "true"
console.log(re.test(str)); // matches, "true"

Примечание: для кода в вашем вопросе я получаю тот же вывод в узле, что и в Chrome и в Firefox: true true.

  • 1
    Спасибо! Это объясняет Причина, по которой я получаю false false в узле, заключается в том, что мой оригинальный код записал re.test (str) перед двумя операторами &&.
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
>

Изображение 174551

Я уверен, что это происходит из-за повторного использования глобального регулярного выражения.

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
    Спасибо. Это действительно причина. Извините, я не могу пометить ваше сообщение как ответ, так как другое сообщение пришло раньше, чем ваше.
  • 0
    неважно, спасибо. кстати, вы все равно можете проголосовать за меня ͡⚆ ͜ʖ ͡⚆
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню