JS 检测代码格式化
console.log("start");
function t(){
return t.toString().search('(((.+)+)+)+$').toString();
}
a=t();
console.log("end");
运行这段代码,会发现,程序执行不到log("end"),
但如果去掉t函数中的回车换行:
console.log("start");
function t(){ return t.toString().search('(((.+)+)+)+$').toString();}
a=t();
console.log("end");
那么,重点中的重点找到了,就是 serach 语句。
serach 与 indexof 相似,不同的是 search 是强制正则表达式的,而 indexOf 只是按字符串匹配的。serach将(((.+)+)+)+$视为正则表达式进行匹配。
到此,大体明白了它的原理了,其实也就是递归,让程序执行不下去。
再来看正则表达式:(((.+)+)+)+$
“.”:匹配除 "\n" 之外的任何单个字符。
“+”:匹配前面的子表达式一次或多次。
(pattern): 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。
“$”: 与字符串结束的地方匹配,不匹配任何字符
测试正则表达式:
var str= `function t(){ console.log( t.toString().search('(((.+)+)+)+$').toString() );}`;
console.log( /(((.+)+)+)+$/.test(str) )
console.log("start");
正常
var str= `function t(){
console.log( t.toString().search('(((.+)+)+)+$').toString() );
}`;
console.log( /(((.+)+)+)+$/.test(str) )
console.log("start");
执行会被卡死