此代码用作计算器,但 codeacademy 的草稿本告诉我 eval 是邪恶的。有没有另一种方法可以在不使用 eval 的情况下做同样的事情?
var calculate = prompt("Enter problem");
alert(eval(calculate));
最佳答案
eval
将字符串输入作为 JavaScript 计算,巧合的是 JavaScript 支持计算并理解 1+1
,这使得它适合作为计算器。
如果您不想使用 eval
,这很好,您必须自己解析该字符串,最后,自己进行计算(虽然不完全是您自己)。看看this math processor ,它可以满足您的需求。
基本上你要做的是:
- 逐字符读取输入字符串(遇到这种问题还是有可能的)
- 构建一个你想做的 Action 树
- 在字符串的末尾,您评估树并进行一些计算
例如您有"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/