You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 02:54:58