EVAL替代(Eval alternative)

2019-07-20 01:27发布

此代码的工作作为一个计算器,但在codeacademy便笺告诉我的eval是邪恶的。 是否有另一种方式做同样的事情,而不使用eval?

var calculate = prompt("Enter problem");
alert(eval(calculate));

Answer 1:

eval评估串输入作为JavaScript和巧合的JavaScript支持计算和理解1+1 ,这使得它适合作为一个计算器。

如果你不希望使用eval ,这是很好的,你必须自己分析这个字符串,最后,做自己的计算(不完全自己虽然)。 看看这个数学处理器 ,这你想要做什么。

基本上,你要做的是:

  1. 读取字符输入串字符(含这类问题,它仍然可能)
  2. 建立你想要做的动作树
  3. 在字符串的结尾,您评估树,做一些计算

例如,你有"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))

正如你可能已经注意到,这棵树被设计在它的荣誉运算符优先级的方式。 该/比一个较低的水平+ ,这意味着它得到的评价第一。

但是你这样做了详细,这基本上要走的路。



Answer 2:

您可以通过过滤输入 - 使用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()


Answer 3:

您可以使用包含在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


Answer 4:

我写了一些功能,当我有这样的问题。 也许这可以帮助:

 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 



文章来源: Eval alternative