简化的动态算术运算符

时间:2014-01-03 06:04:51

标签: javascript eval

我正在重新审视这个我曾经处理过的旧项目,我希望避免使用if语句和切换块来渲染一个简单的计算,其中运算符(+ / - / {{ 1}} / /)可以是任何东西。

我正在通过ajax从数据库(安全插入)中检索数据,以及用户输入的beta情况(再次通过验证精心确保)。这很好,但是很好。现在我们来到我听过这么多的恶魔。 *

如果您花时间阅读,使用V8引擎之类的现代浏览器可以缓存已编译的eval。人们说它会通过注射产生脆弱性。如果您提供有效的验证并避免任何关键应用程序错误结构,那么它如何有害?

eval()

这还不安全吗?它比switch语句更有效吗?嵌套的if语句?如果性能不是问题,并且您确实知道自己在做什么,那么//note I'm using var just for clarity, this is NOT the declaration or assignment statment //also note the variables are stored in an array because the condition can be dynamic in size, but that's overhead for now var firstNum = 50; var secondNum = 100; var operator = "+"; var condition = firstNum+operator+secondNum; if (eval(condition) > 149) { //not the real condition, just an example console.log("Success"); } 可以是好的,而不是......等待它...... eval()

注意:是的,我已经看到了关于evil()的其他问题,但我仍然没有找到这个甚至存在的理由,因为人们把它视为麻风病人。

这基本上归结为:处理数学运算符不是静态值的条件的最佳方法是什么?

1 个答案:

答案 0 :(得分:9)

eval部分是有害的,因为

  • 为了避免代码注入,你必须要小心。
  • 大多数IDE无法在动态构建的字符串中捕获愚蠢的语法错误。
  • 它在历史上表现得很糟糕。
  • 它基本上是用大锤拍打苍蝇,这是其他很多原因的主要原因。非常,非常很少的情况会从这么大的灵活性中受益,而且大多数情况会变得更糟。

在这种情况下,您可以执行类似

的操作
var operators = {
    '+' : function(a, b) { return a + b; },
    '-' : function(a, b) { return a - b; },
    '*' : function(a, b) { return a * b; },
    '/' : function(a, b) { return a / b; },
};

var firstNum = 50;
var secondNum = 100;
var op = operators['+'];

if (op(firstNum, secondNum) > 149) {
    console.log('Success');
}

并最终获得您正在寻找的所有动态eval,没有任何缺点。您可以准确定义要允许的操作,更重要的是,您甚至不限于中缀运算符 - 例如,您可以使用'max'运算符或'round'。