Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 评估替代方案_Javascript_Math_Eval_Calculator - Fatal编程技术网

Javascript 评估替代方案

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,这很好,那么您必须自己解析该字符串,最后,自己进行计算,而不是完全由您自己进行。看一看,这正是你想要的

这段代码就像一个计算器,但是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将字符串输入作为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。这意味着你的数学处理器也应该考虑操作员优先级。哦,呃,是的。我本想那样写的。