JavaScript RegExp оценка - PullRequest
       8

JavaScript RegExp оценка

0 голосов
/ 23 февраля 2019

Я искал какой-то код и нашел первую строку.Я начал смущаться, когда обнаружил, что если я попытаюсь упростить его таким образом, чтобы семантика осталась прежней, это не то же самое, и результат изменится.Кто-нибудь может объяснить мне это поведение?

RegExp("\x3c").test(function(){return"\x3c"}) //false
RegExp("<").test(function(){return"<"})       //true
RegExp("\x3c").test("\x3c")                   //true
RegExp("<").test("<")                         //true

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

test принимает в качестве параметра строку по умолчанию, любой другой тип будет преобразован в строку

const a = function(val) {
  return val
}
console.log(a)
const res = RegExp("\x3c").test(a) //false
const res2 = RegExp("<").test(a) //false

console.log(res, res2)

const b = function() {
  return "<"
}

const res3 = RegExp("<").test(b)

console.log(res3) //true

результат false для обеих причин "функция (val) {возвращать val}" не содержит совпадений

res3 является истинной причиной "function(){return '<'}" совпадение "<"

0 голосов
/ 23 февраля 2019

Когда вы передаете не-строку в .test, она преобразуется в строку, без , заменяя любой из буквенных символов в коде функции.Посмотрите на строчную версию ваших первых двух функций:

console.log(function(){return"\x3c"}.toString());
console.log(function(){return"<"}.toString());

Поскольку в источнике первой функции был "\x3c", в строковой версии это также есть - "\x3c" не заменяется '<'.Хотя "\x3c" === '<', интерпретатор не делает эту замену для вас при строковой функции .

Когда вы передаете "\x3c" в new RegExp, хотя (или в любую функцию,например, при третьем тесте будет превращаться в '<':

console.log("\x3c");
console.log(RegExp("\x3c"));

Итак, ваш исходный код эквивалентен:

/</.test(String.raw`function(){return"\x3c"}`); //false
/</.test(String.raw`function(){return"<"}`);    //true
/</.test("<");                        //true
/</.test("<");                        //true
...