У меня есть несколько строк кода javascript, как показано ниже:
var str = '////';
var re = /^\/+$/g
console.log(str && re.test(str), str && !re.test(str));
Результатом кода в Node.js
являются false, false
и в стороне Chrome
Client - true, true
Я очень смущен, и кто-нибудь поможет понять:
true
или false
то время как они должны быть противоположными?Chrome
и Node.js
при оценке двух булевых операторов?Из 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
.
false false
в узле, заключается в том, что мой оригинальный код записал re.test (str) перед двумя операторами &&.
Я думаю, что это не кажется ответом, но 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
true
иtrue
для меня