Когда вы передаете не-строку в .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