我在看一些代码,发现第一行。当我发现如果我尝试以一种使语义保持相同的方式简化它的过程时,我就感到困惑,结果就改变了。谁能向我解释这种行为?
RegExp("\x3c").test(function(){return"\x3c"}) //false
RegExp("<").test(function(){return"<"}) //true
RegExp("\x3c").test("\x3c") //true
RegExp("<").test("<") //true
最佳答案
当您将非字符串传递给.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
关于javascript - JavaScript RegExp评估,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54836316/