Eval替代品

1 javascript math eval calculator

这段代码用作计算器,但是codeacademy的便笺告诉我,eval是邪恶的.有没有另一种方法可以在不使用eval的情况下做同样的事情?

var calculate = prompt("Enter problem");
alert(eval(calculate));
Run Code Online (Sandbox Code Playgroud)

nem*_*emo 5

eval将字符串输入评估为JavaScript,巧合的是JavaScript支持计算和理解1+1,这使其适合作为计算器.

如果你不想使用eval,这是好的,你必须自己解析该字符串,最后,自己做计算(虽然不是你自己).看看这个数学处理器,它可以满足您的需求.

基本上你做的是:

  1. 通过char读取输入字符串char(有这种问题仍然可以)
  2. 构建您想要执行的操作树
  3. 在字符串的末尾,您评估树并进行一些计算

例如,您"1+2/3"可以评估以下数据结构:

     "+"
     /  \
   "1"  "/"
       /   \
     "2"   "3"
Run Code Online (Sandbox Code Playgroud)

然后,您可以从上到下遍历该结构并进行计算.起初你已经得到了"+",左边有一个,右边有一些表达,所以你必须先评估那个表达式.所以你去了"/"节点,它有两个数字子节点.知道了,你现在可以用它的结果来计算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))
Run Code Online (Sandbox Code Playgroud)

您可能已经注意到,树的设计方式使其符合运算符优先级.在/具有比一个较低的水平+,这意味着它获得的第一个评价.

无论你如何详细地做到这一点,基本上就是这样.