Javascript 评估替代方案
这段代码就像一个计算器,但是codeacademy的便笺簿告诉我eval是邪恶的。有没有其他方法可以不用eval做同样的事情Javascript 评估替代方案,javascript,math,eval,calculator,Javascript,Math,Eval,Calculator,这段代码就像一个计算器,但是codeacademy的便笺簿告诉我eval是邪恶的。有没有其他方法可以不用eval做同样的事情 var calculate = prompt("Enter problem"); alert(eval(calculate)); eval将字符串输入评估为JavaScript,同时JavaScript支持计算并理解1+1,这使它适合作为计算器 如果您不想使用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将字符串输入作为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()
通过过滤输入,您可以安全地将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库中包含的表达式解析器: 用法示例:
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
您可以使用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
当我遇到这样的问题时,我写了一些函数。也许这会有帮助: 数据=[ {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.keysdata[0]; //这里是对e['datakey[f]']>>e[x]的修复 vix=函数e,f{ a=字符串; e[a]=数据键[f]; x=e.string; end=e[x]; 删除e.string; 返回端; }; //下面是定义该变量的修复程序 vox=函数e、f、字符串{ a=字符串; e[a]=数据键[f]; x=e.string; end=e[x]=字符串; 删除e.string; }; 行=2//3行==>{id:3,val1:test,val2:test2,val2:test3} column=1//datakey 2==>val1 voxdata[行],列,新值;
alertdata[2].val1//当我遇到这样的问题时,我写了一些函数。也许这会有帮助: 数据=[ {id:1,val1:test,val2:test2,val2:test3}, {id:2,val1:test,val2:test2,val2:test3}, {id:3,val1:test,val2:test2,val2:t est3} ]; datakey=Object.keysdata[0]; //这里是对e['datakey[f]']>>e[x]的修复 vix=函数e,f{ a=字符串; e[a]=数据键[f]; x=e.string; end=e[x]; 删除e.string; 返回端; }; //下面是定义该变量的修复程序 vox=函数e、f、字符串{ a=字符串; e[a]=数据键[f]; x=e.string; end=e[x]=字符串; 删除e.string; }; 行=2//3行==>{id:3,val1:test,val2:test2,val2:test3} column=1//datakey 2==>val1 voxdata[行],列,新值;
alertdata[2].val1//我们已经更改的值是否要将一个表达式从字符串解析为工作代码?然后你需要构建一个解析器。而构建一个解析器绝非易事。@Adamrack确实不错,但处理中缀运算的东西并没有那么糟糕-这可能是我的第一个解析器项目中最好的一个:-@VisioN:这是有效的eval。@VisioN这就像用mozzarella代替切达干酪来对付乳糖不耐受的人:-你想解析吗从字符串到工作代码的等式?然后你需要构建一个解析器。构建一个解析器并不是一件容易的事情。@Adamrack是正确的,但处理中缀运算的东西并没有那么糟糕-它可能是我的第一个解析器项目中最好的:-@VisioN:这是有效的评估。@VisioN这就像用莫扎里拉代替切达干酪来对付乳糖不耐受的人:-嗯,1+2/3将导致1+2/3,但不会导致1+2/3。所以答案是1.66,而不是3/3。这意味着你的数学处理器也应该考虑操作员优先级。哦,呃,是的。我本来想这样写的,1+2/3会变成1+2/3,但不是1+2/3。所以答案是1.66,而不是3/3。这意味着你的数学处理器也应该考虑操作员优先级。哦,呃,是的。我本想那样写的。