eval()的替代方法javascript
我主要使用javascript,Jquery,knockout等
吸引eval()给我的是
var a = 5; var b = 10; eval("a+b"); //Gives me output 15
注意:我工作的情况是a
和b
的值动态变化
在我的工作中,我正在处理来自json,knockout等的许多动态对象。所以eval解决了我的大部分问题。 但正如我读到的那样,我发现eval()有很多问题,如减速等。
我搜索了很多并且没有找到任何替代eval()的时候我必须将方程式作为对象的方程式获得。
任何人都可以建议一个插件或function替代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); })"
在这方面,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
技巧。
希望有所帮助。
也许使用window['var' + num]
可能对你更有用。 我不太明白你的问题对不起。
你的意思是你想要计算一个你知道的方程式,直到你收到它为止?
如果是这样,请参阅在javascript中计算字符串值,而不是使用eval 。
简而言之:
有时候可以使用eval,但只有当方程式字符串来自可靠来源时,才需要评估动态方程式 。
如果你可以在root = {a: 1, b: 2}
类的对象下收集它们,那么
Object.observe(root, function(newValues) { res = newValues.object.a + newValues.object.b; });
只要a
或b
发生变化,就可以使你的res
变量保持最新状态
看起来您正在尝试执行用户创建的动态方程式。
例如,它可能是’a + b + c’或’dog + cat’,你不知道。
处理用户输入方程式的最佳方法是将文本解析为标记,然后将标记转换为值/操作数。
这是很多工作,但有预先推出的解决方案。 例如, math.js
在这个问题中检查eval
更多替代方案,在这里检查另一个可能被认为是重复的…
我知道这是一个仅链接的答案,但它肯定会有助于其他人搜索eval
替代品。