1

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));
4

4 回答 4

5

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))

您可能已经注意到,树的设计方式是尊重运算符优先级。的/级别低于+,这意味着它首先得到评估。

无论您如何详细执行此操作,这基本上都是要走的路。

于 2013-02-17T01:07:03.983 回答
2

您可以使用 math.js 库中包含的表达式解析器:

http://mathjs.org

示例用法:

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
于 2013-04-28T12:48:07.950 回答
1

您可以通过过滤输入安全地将 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()
于 2013-02-17T07:04:20.640 回答
0

当我遇到这样的问题时,我编写了一些函数。也许这可以帮助:

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

于 2017-01-16T16:56:17.697 回答