解析js字符串
2024-10-10 10:21:09
myEval
export const evalExp = /[!\&\|\+\-\*\%=\/<\>\^\(\)\~\:\?\;]/g;
export function myEval(originString: string, context: any) {
if (!context) return;
let bindKey = originString;
bindKey = bindKey.replace(evalExp, " ");
let bindKeys = bindKey
.split(" ")
.map(s => s.trim())
.filter(e => !!e)
.filter(e => {
if (/^['"`]/.test(e)) {
return false;
}
// 过滤布尔值
if (e === "true" || e === "false") {
return false;
}
// 过滤number
if (!isNaN(+e)) {
return false;
}
return true;
});
let args = bindKeys.map(s => {
if (/\./.test(s) && /\[|\]/g.test(s)) {
let aindex = s.indexOf(".");
let bindex = s.indexOf("[");
let index = Math.min(aindex, bindex);
let obj = s.substr(0, index);
return obj;
} else if (/\./.test(s)) {
let aindex = s.indexOf(".");
let obj = s.substr(0, aindex);
return obj;
} else if (/\[|\]/g.test(s)) {
let bindex = s.indexOf("[");
let obj = s.substr(0, bindex);
return obj;
}
return s;
});
args = toArray(new Set(args));
const newArgs: string[] = [];
let datas = args.map((k) => {
if (k in context) {
newArgs.push(k)
return context[k]
}
}).filter(e => !!e);
if (!datas.length) return;
let funbody = `return function(${newArgs.toString()}) {
'use strict';
${originString};
}`;
return Function(funbody)()(...datas);
}
evalFun
export function evalFun(bindKey: string, data: any) {
if (undefinedp(data)) return;
try {
const r = Function(`with(this){ return ${bindKey} }`).apply(data, arguments)
return r === '' ? undefined : r;
} catch (error) {
}
}
setData
export function setData(key: string, newValue: any, contextData: ContextData) {
if (!stringp(key)) return null;
return Function(`return function(d) {
with(this){
${key} = d;
}
}`)().call(contextData.store, newValue);
}
最新文章
- C++基础_总结
- 我的SpringMVC配置
- Photoshop的评价
- 在CentOS6.5上安装MariaDB
- excel、csv、txt文件数据读取
- 一个NULL引发的血案
- Chorme dev tools小技巧
- 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板
- .NET ORM框架(一)
- Android+OpenCV 摄像头实时识别模板图像并跟踪
- iOS开发——真机调试证书—发布证书
- 关于一次Weblogic活动线程的问题处理
- FMDB 的基本操作
- git 查看当前与上一次version的差异
- 一张图解析nvm,npm,nodejs之间的关系
- SDN/NFV趋势思考点滴
- ZOJ 3604 Tunnel Network(凯莱定理)
- LeetCode算法题-Range Addition II(Java实现)
- Java系统高并发之Redis后端缓存优化
- php中inset 和 和 empty 的区别