我主要使用javascript,Jquery,knockout等
吸引eval()给我的是
var a = 5;
var b = 10;
eval("a+b");
//Gives me output 15
注意:我在a
和b
的值动态变化的情况下工作
在我的工作中,我正在处理来自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); })"
答案 0 :(得分:16)
Javascript在这方面是一种非常灵活的语言。有很多非常的情况,其中eval()
是任何给定问题的正确答案,在这里肯定没有必要。
如果您的a
和b
变量是对象的一部分,则可以使用字符串下标访问它们:
即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
字符串,因此几乎具有无限的灵活性。
如果您的a
和b
变量是全局变量,浏览器中的JS全局变量实际上是window
对象的子变量,因此即使使用全局变量,您仍然可以使用此技术。
即您的全局变量a
也可以通过window.a
或window['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;
});
每当res
或a
更改时,都可以使您的b
变量保持最新状态
答案 4 :(得分:0)
看起来你正在尝试用户创建动态方程式。
例如,它可能是' a + b + c'或者' dog + cat',你不知道。
处理用户输入方程式的最佳方法是将文本解析为标记,然后将标记转换为值/操作数。
这项工作很多,但有预先解决的问题。例如,math.js
答案 5 :(得分:0)
在this question和another one here中检查eval
的更多替代方案,这些方案可能被视为重复...
我知道这是一个仅限链接的答案,但对于其他搜索eval
的替换内容的人来说肯定会有所帮助。