替代eval()javascript

时间:2013-04-16 12:26:07

标签: javascript jquery jquery-plugins eval

我主要使用javascript,Jquery,knockout等

吸引eval()给我的是

var a = 5;
var b = 10;
eval("a+b");
//Gives me output 15

注意:我在ab的值动态变化的情况下工作

在我的工作中,我正在处理来自json,knockout等的许多动态对象。所以eval解决了我的大部分问题。 但是当我读到时,我发现eval()有很多问题,比如放慢速度等等。

我经常搜索并且没有找到任何替代eval()的时候我必须将方程式作为字符串求解为方程式作为对象。

任何人都可以建议使用eval()的插件或函数替代,记住上面给出的示例

问题:

我正在使用淘汰赛映射从Json数据创建一个表。因此,生成json格式的表格。我还使用knockout计算了一些场。 现在我使用硬编码

self.Salary = ko.computed(function(){ return self.salaryEqn() && eval(self.salaryEqn()).toFixed(2); })
self.salaryEqn(salEqnTxt); 

我想动态执行这些方程式。我可以将它动态地创建为字符串,但是评估它们是我面临的问题。

我想要解决方案

有没有办法在不使用eval的情况下计算存储在JavaScript中的字符串中的公式?

像公式一样

 "self.Salary = ko.computed(function(){ return self.salaryEqn() && eval(self.salaryEqn()).toFixed(2); })"

6 个答案:

答案 0 :(得分:16)

Javascript在这方面是一种非常灵活的语言。有很多非常的情况,其中eval()是任何给定问题的正确答案,在这里肯定没有必要。

如果您的ab变量是对象的一部分,则可以使用字符串下标访问它们:

myobj.a也可以引用为myobj['a']

从那里,您可以使用变量作为下标,因此您可以动态引用myobj中的任何元素 - 即:

var myobj = {a : 5, b : 10};

var dynamicProperty1 = 'a';
var dynamicProperty2 = 'b';

//gives 15.
alert( myobj[dynamicProperty1] + myobj[dynamicProperty2] );

不需要eval()。您可以根据需要构建dynamicProperty字符串,因此几乎具有无限的灵活性。

如果您的ab变量是全局变量,浏览器中的JS全局变量实际上是window对象的子变量,因此即使使用全局变量,您仍然可以使用此技术。

即您的全局变量a也可以通过window.awindow['a']访问,后一个选项允许您执行上述相同的dynamicProperty技巧。

希望有所帮助。

答案 1 :(得分:3)

使用window['var' + num]可能对您更有用。我不太明白你的问题抱歉。

答案 2 :(得分:2)

你的意思是你想要计算一个你收到它之前你不知道的等式吗?

如果有,请参阅Calculate string value in javascript, not using eval

简而言之:

eval有时候可以使用,但只有当方程式字符串来自可靠来源,并且你需要像评估动态方程式那样。

答案 3 :(得分:1)

如果您可以在root = {a: 1, b: 2}之类的对象下收集它们,那么

Object.observe(root, function(newValues) { 
    res = newValues.object.a + newValues.object.b;
});
每当resa更改

时,

都可以使您的b变量保持最新状态

答案 4 :(得分:0)

看起来你正在尝试用户创建动态方程式。

例如,它可能是' a + b + c'或者' dog + cat',你不知道。

处理用户输入方程式的最佳方法是将文本解析为标记,然后将标记转换为值/操作数。

这项工作很多,但有预先解决的问题。例如,math.js

答案 5 :(得分:0)

this questionanother one here中检查eval的更多替代方案,这些方案可能被视为重复...

我知道这是一个仅限链接的答案,但对于其他搜索eval的替换内容的人来说肯定会有所帮助。