javascript - 评估备选方案

标签 javascript math eval calculator

此代码用作计算器,但 codeacademy 的草稿本告诉我 eval 是邪恶的。有没有另一种方法可以在不使用 eval 的情况下做同样的事情?

var calculate = prompt("Enter problem");
alert(eval(calculate));

最佳答案

eval 将字符串输入作为 JavaScript 计算,巧合的是 JavaScript 支持计算并理解 1+1,这使得它适合作为计算器。

如果您不想使用 eval,这很好,您必须自己解析该字符串,最后,自己进行计算(虽然不完全是您自己)。看看this math processor ,它可以满足您的需求。

基本上你要做的是:

  1. 逐字符读取输入字符串(遇到这种问题还是有可能的)
  2. 构建一个你想做的 Action 树
  3. 在字符串的末尾,您评估树并进行一些计算

例如您有"1+2/3",这可以计算为以下数据结构:

     "+"
     /  \
   "1"  "/"
       /   \
     "2"   "3"

然后您可以从上到下遍历该结构并进行计算。 首先你有 "+",它的左边是 1,右边是一些表达式, 所以你必须先评估那个表达式。所以你转到 "/" 节点,它有两个数字子节点。知道这一点后,您现在可以计算 2/3 并将整个 "/" 节点替换为该结果。现在您可以再次向上计算“+”节点的结果:1 + 0.66。现在用结果替换该节点,剩下的就是表达式的结果。

关于这在您的代码中的样子的一些伪代码:

calculation(operator, leftValue, rightValue):
   switch operator {
      case '+': return leftValue + rightValue
      case '-': return 42
   }

action(node):
   node.value = calculation(node.operator, action(node.left) action(node.right))

您可能已经注意到,树的设计方式遵循运算符优先级。 / 的级别低于 +,这意味着它首先被计算。

无论您如何详细地执行此操作,基本上都是要走的路。

关于javascript - 评估备选方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14916902/

相关文章:

javascript - 在导航图标 css 下包装文本

javascript - VScode 将文件检测为 JavaScript,但不会突出显示未定义的函数

javascript - 按元素名称中的索引选择元素

ios - 转换从 CMMotionManager() 获取的 3D 位置以在 2D CG 坐标系上设置角度

javascript - 如何覆盖javascript中的eval函数?

javascript - Bootstrap Selectpicker 问题

math - 简单的 MATLAB/Octave 模拟

algorithm - 确定一组数据是来自线性函数还是对数函数?

asp.net - 在 ASP.NET 中将对象数组列表绑定(bind)到 ListView

javascript - 从字符串执行 jquery 命令而不使用 eval()