这段代码就像一个计算器,但是codeacademy的便签簿告诉我eval是邪恶的。有没有其他方法可以不使用eval来做同样的事情?
var calculate = prompt("Enter problem");
alert(eval(calculate));发布于 2013-02-17 09:07:04
eval将字符串输入计算为JavaScript,巧合的是,JavaScript支持计算并理解1+1,这使得它适合作为计算器。
如果您不想使用eval,这很好,您必须自己解析该字符串,最后,自己进行计算(但不完全是您自己)。看看this math processor,它可以做你想做的事情。
基本上你要做的是:
逐个字符地读取输入字符串(对于这种问题,它仍然是您想要执行的操作的树。在字符串的末尾,您可以评估该树并执行一些calculations操作(
例如,您有"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))正如您可能已经注意到的,树的设计方式是遵循运算符的优先级。/的级别比+低,这意味着它首先被评估。
无论您如何详细地执行此操作,基本上都是这样做的。
发布于 2013-04-28 20:48:08
您可以使用math.js库中包含的表达式解析器:
http://mathjs.org
示例用法:
mathjs.evaluate('1.2 / (2.3 + 0.7)'); // 0.4
mathjs.evaluate('5.08 cm in inch'); // 2 inch
mathjs.evaluate('sin(45 deg) ^ 2'); // 0.5
mathjs.evaluate('9 / 3 + 2i'); // 3 + 2i
mathjs.evaluate('det([-1, 2; 3, 1])'); // -7发布于 2013-02-17 15:04:21
对于一个简单的算术计算器,你可以通过过滤输入来安全地使用eval -如果你只接受数字,小数点和运算符(+,-,*,/),你不会有太多麻烦。如果你想要高级的数学函数,最好参考解析器的建议。
function calculate(){
"use strict";
var s= prompt('Enter problem');
if(/[^0-9()*+\/ .-]+/.test(s)) throw Error('bad input...');
try{
var ans= eval(s);
}
catch(er){
alert(er.message);
}
alert(ans);
}
calculate()https://stackoverflow.com/questions/14916902
复制相似问题