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

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/

10-11 00:15