是否存在功能类似eval且支持log、ln、sqrt等表达式的JS方法?
可实现高级数学表达式计算的方案
方案1:使用现成的数学表达式解析库
不用自己手写逻辑,社区有很多经过验证的纯JS轻量级表达式计算库,兼容React Native环境,天生支持log()、ln()、sqrt()、三角函数、阶乘等各类常用数学运算,而且默认只会解析预定义的数学语法,不会执行任意JS代码,比直接调用eval安全很多,完全能满足计算器类项目的需求。
方案2:无额外依赖,手动封装安全计算方法
如果你的计算器功能比较简单,不想引入额外依赖,可以自己封装一个沙箱隔离的计算方法,示例代码如下:
function safeMathEval(expression) { // 配置函数别名,可根据自己的需求增减 const mathAlias = { ln: 'Math.log', // 自然对数 log: 'Math.log10', // 10为底的常用对数 sqrt: 'Math.sqrt', sin: 'Math.sin', cos: 'Math.cos', pow: 'Math.pow', pi: 'Math.PI', e: 'Math.E' }; // 替换表达式中的别名为Math对象对应的属性/方法 let processedExp = expression; Object.entries(mathAlias).forEach(([alias, realPath]) => { const reg = new RegExp(`\\b${alias}\\b`, 'g'); processedExp = processedExp.replace(reg, realPath); }); // 校验表达式仅包含合法字符,避免代码注入 const validRule = /^[\d\s+\-*/().,Mathlogsqrt sincostanpowPIE]+$/; if (!validRule.test(processedExp)) { throw new Error('表达式包含非法内容'); } // 用Function构造函数隔离执行上下文,避免访问外层作用域变量 return new Function('"use strict";return (' + processedExp + ')')(); } // 测试用例 safeMathEval('ln(e)') // 输出 1 safeMathEval('log(1000)') // 输出 3 safeMathEval('sqrt(25) + pow(2,3)') // 输出 13
注意事项
- 绝对不要直接用原生
eval执行用户输入的任意字符串,存在远程代码执行的安全风险 - 上述自定义方法的校验规则可以根据你需要支持的运算符号自行扩展,比如要支持取模就加
%到规则里即可
内容的提问来源于stack exchange,提问作者m3k_1
相关产品推荐
相关产品推荐

