This code works as a calculator, but the scratch pad at codeacademy tells me that eval is evil. Is there another way to do the same thing without using eval?
var calculate = prompt("Enter problem");
alert(eval(calculate));
This code works as a calculator, but the scratch pad at codeacademy tells me that eval is evil. Is there another way to do the same thing without using eval?
var calculate = prompt("Enter problem");
alert(eval(calculate));
eval
将字符串输入评估为 JavaScript,巧合的是,JavaScript 支持计算和理解1+1
,这使其适合用作计算器。
如果您不想使用eval
,这很好,您必须自己解析该字符串,最后自己进行计算(虽然不完全是您自己)。看看这个数学处理器,它可以满足你的需求。
基本上你要做的是:
例如,您有"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))
您可能已经注意到,树的设计方式是尊重运算符优先级。的/
级别低于+
,这意味着它首先得到评估。
无论您如何详细执行此操作,这基本上都是要走的路。
您可以使用 math.js 库中包含的表达式解析器:
示例用法:
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
您可以通过过滤输入安全地将 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()
当我遇到这样的问题时,我编写了一些函数。也许这可以帮助:
data = [
{id:1,val1:"test",val2:"test2",val2:"test3"},
{id:2,val1:"test",val2:"test2",val2:"test3"},
{id:3,val1:"test",val2:"test2",val2:"test3"}
];
datakey = Object.keys(data[0]);
// here's a fix for e['datakey[f]'] >> e[x]
vix = function(e,f){
a = "string";
e[a] = datakey[f];
x = e.string;
end = e[x];
delete e.string;
return end;
};
// here's a fix to define that variable
vox = function(e,f,string){
a = "string";
e[a] = datakey[f];
x = e.string;
end = e[x] = string;
delete e.string;
};
row = 2 // 3th row ==> {id:3,val1:"test",val2:"test2",val2:"test3"}
column = 1 //datakey 2 ==> val1
vox(data[row],column,"new value");
alert(data[2].val1); //the value that we have changed