function cloneFunction(func) {
// 在正则表达式中dot( ".")几乎匹配任意一个字符,但是不匹配换行符\n。
// ?<= : 询问要去匹配的目标是否以这个东西开头;?= : 询问要去匹配的目标的后面跟着的东西是否等于这个
const bodyReg = /(?<={)(.|\n)+(?=})/m; // 匹配方法体
const paramReg = /(?<=().+(?=)\s+{)/; // 匹配参数
const funcString = func.toString();
// 判断是箭头函数还是普通函数,箭头函数没有prototype
if (func.prototype) {
console.log('普通函数');
const param = paramReg.exec(funcString);
const body = bodyReg.exec(funcString);
if (body) {
console.log('匹配到函数体:', body[0]);
if (param) {
const paramArr = param[0].split(',');
console.log('匹配到参数:', paramArr);
return new Function(...paramArr, body[0]);
} else {
return new Function(body[0]);
}
} else {
return null;
}
} else {
return eval(funcString);
}
}
与之相关的# 正则表达式的零宽断言:?=、?<=、?!、?<! 的具体使用区别
1、将 < 看成方向,包含这个箭头说明是放在要去匹配的目标内容的左边(来开头)
2、把 ?! 看成 ?!= 就好了
3、一定要记住:匹配得到的结果并不包含 ?=、?<=、?!和?<!=里面的内容的
?=、?<=、?!、?<! 的具体使用区别:
【1】?= : 询问要去匹配的目标的后面跟着的东西是否等于这个 eg: ^b(?=a) —— ab 【3】?! : 询问要去匹配的目标后面跟着的东西是否 不是这个 eg:^b(?!a) —— bb
官方例子:
?= exp1(?=exp2): 查找在 exp2 前面的 exp1。
?<= (?<=exp2)exp1: 查找在 exp2 后面的 exp1。
?! exp1(?!exp2): 查找后面不是 exp2 的 exp1。
?<! (?<!exp2)exp1:查找前面不是 exp2 的 exp1。