此代码的工作作为一个计算器,但在codeacademy便笺告诉我的eval是邪恶的。 是否有另一种方式做同样的事情,而不使用eval?
var calculate = prompt("Enter problem");
alert(eval(calculate));
此代码的工作作为一个计算器,但在codeacademy便笺告诉我的eval是邪恶的。 是否有另一种方式做同样的事情,而不使用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))
正如你可能已经注意到,这棵树被设计在它的荣誉运算符优先级的方式。 该/
比一个较低的水平+
,这意味着它得到的评价第一。
但是你这样做了详细,这基本上要走的路。
您可以通过过滤输入 - 使用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()
您可以使用包含在math.js库中的表达式解析器:
http://mathjs.org
实例:
math.eval('1.2 / (2.3 + 0.7)'); // 0.4
math.eval('5.08 cm in inch'); // 2 inch
math.eval('sin(45 deg) ^ 2'); // 0.5
math.eval('9 / 3 + 2i'); // 3 + 2i
math.eval('det([-1, 2; 3, 1])'); // -7
我写了一些功能,当我有这样的问题。 也许这可以帮助:
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