如何在JavaScript中处理存储于JSON中的数学公式
问题解答
你的方法是否可行?
你当前的代码存在语法错误,eval(D1 conversions[0].Math)会直接报错,需要调整为eval(D1 + conversions[0].Math)才能正常执行计算。但非常不推荐使用这种方式:
- 安全风险极高:如果
Math字段被注入恶意代码(比如JSON数据源不可信),eval会执行任意代码,引发安全漏洞。 - 调试难度大:
eval执行的代码无法直接断点调试,出现问题后排查麻烦。
更好的实现方法
方法1:存储运算类型与系数(最安全通用)
把JSON里的Math字段拆分为运算类型和固定数值,避免直接存储表达式:
{ "conversions": [ { "FromType": "in3", "ToType": "ft3", "Op": "divide", "Value": 1728, "Description": "divide the volume value by 1728" } ] }
通过逻辑判断处理不同运算:
const D1 = document.getElementById("data1").value; const inputNum = parseFloat(D1); if (isNaN(inputNum)) { alert("请输入有效数字"); return; } const conversion = conversions[0]; let theAnswer; switch(conversion.Op) { case "divide": theAnswer = inputNum / conversion.Value; break; case "multiply": theAnswer = inputNum * conversion.Value; break; case "add": theAnswer = inputNum + conversion.Value; break; case "subtract": theAnswer = inputNum - conversion.Value; break; }
这种方式彻底规避了eval的风险,逻辑清晰,还能轻松扩展更多运算类型。
方法2:统一用乘法系数(适合单位换算场景)
大部分单位换算都是乘除固定系数,可以把除法转换为乘法(比如除以1728等价于乘以1/1728),JSON仅存储转换系数:
{ "conversions": [ { "FromType": "in3", "ToType": "ft3", "Factor": 0.0005787037037, // 即1/1728 "Description": "divide the volume value by 1728" } ] }
计算时直接执行乘法:
const D1 = document.getElementById("data1").value; const inputNum = parseFloat(D1); if (isNaN(inputNum)) { alert("请输入有效数字"); return; } const theAnswer = inputNum * conversions[0].Factor;
这是单位换算场景下最简洁安全的方案,代码量最少,无任何安全隐患。
方法3:用new Function替代eval(仅适用于复杂运算且数据源可信时)
如果必须支持复杂表达式,且能100%确保JSON内容完全可信(比如自己维护的静态数据),可以用new Function替代eval,比eval更可控:
const D1 = document.getElementById("data1").value; const inputNum = parseFloat(D1); if (isNaN(inputNum)) { alert("请输入有效数字"); return; } const calculate = new Function("x", `return x ${conversions[0].Math};`); const theAnswer = calculate(inputNum);
这种方式的风险比eval低,但仍需严格保证Math字段不会被恶意篡改。
内容的提问来源于stack exchange,提问作者Big Fat Designs
相关产品推荐
相关产品推荐

