JavaScript RegExp评估

时间:2019-02-22 22:55:05

标签: javascript regex evaluation

我正在看一些代码,找到了第一行。当我发现如果我尝试以一种使语义保持不变的方式简化它的过程时,我就感到困惑。谁能向我解释这种行为?

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

2 个答案:

答案 0 :(得分:5)

当您将非字符串传递给.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

答案 1 :(得分:0)

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都导致“ function(val){return val}”不包含任何匹配项

res3是真的原因"function(){return '<'}"匹配"<"