eval()javascript的替代方案

eval()javascript的替代方案,javascript,jquery,jquery-plugins,eval,Javascript,Jquery,Jquery Plugins,Eval,我主要使用javascript、Jquery、knockout等 吸引eval()的是 注意:我在a和b的值动态变化的情况下工作 在我的工作中,我处理了很多来自json、knockout等的动态对象,所以eval解决了我的大部分问题。 但是当我阅读时,我发现eval()有很多问题,比如速度变慢等等 我搜索了很多,当我必须将方程作为字符串计算为方程作为对象时,没有找到任何eval()的替代品 请记住我上面给出的例子,有人能推荐一个插件或函数替代eval()吗 问题: 我正在使用敲除映射从Json数

我主要使用javascript、Jquery、knockout等

吸引eval()的是

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

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

我搜索了很多,当我必须将方程作为字符串计算为方程作为对象时,没有找到任何eval()的替代品

请记住我上面给出的例子,有人能推荐一个插件或函数替代eval()吗

问题:

我正在使用敲除映射从Json数据创建一个表。因此,无论json的格式是什么,都会生成表。我还使用knockout computed计算一些字段。 现在我用硬编码

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

我需要解决方案

有没有一种方法可以在不使用eval的情况下计算JavaScript中存储在字符串中的公式

像公式一样

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

也许使用
窗口['var'+num]
对您更有用。对不起,我不太明白你的问题。

你的意思是你想计算一个直到你收到才知道的方程式吗

如有,请参阅

简而言之:
有时可以使用eval,但只有当方程字符串来自可信源时,才可以使用eval。在这方面,Javascript是一种非常灵活的语言。很少有情况下,
eval()
是任何给定问题的正确答案,这里当然没有必要这样做

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

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

由此,您可以使用变量作为下标,从而可以动态引用
myobj
中的任何元素——即:

不需要
eval()
。您可以随心所欲地构建
dynamicProperty
字符串,因此实际上具有无限的灵活性

如果
a
b
变量是全局变量,那么浏览器中的JS全局变量实际上是
窗口
对象的子对象,因此即使是全局变量,您也可以使用此技术

ie您的全局变量
a
也可以通过
window.a
window['a']
访问,后者允许您执行上述
dynamicProperty
技巧


希望能有所帮助。

看起来您正在尝试创建由用户创建的动力学方程

例如,它可能是“a+b+c”或“狗+猫”,而你不知道

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


这是一个很大的工作,但也有预先推出的解决方案。例如,

检查中的
eval
的更多备选方案,这两种方案都可能被认为是重复的


我知道这是一个只包含链接的答案,但如果您可以在
root={a:1,b:2}
这样的对象下收集它们,那么它肯定会对其他搜索
eval

替代项的人有所帮助

Object.observe(root, function(newValues) { 
    res = newValues.object.a + newValues.object.b;
});

只要
a
b
发生更改,就可以使您的
res
变量保持最新,这对您的示例不起作用,但是如果您需要的是
将表达式作为字符串计算为表达式作为对象。
那么您可以使用
JSON。解析
通常,您应该尽可能避免使用eval()。检查以下链接,了解使用eval()时遇到的问题。更新:检查此答案以了解javascript中eval的替代方法。
a+b
提供
15
而无需将其表示为字符串,然后对其求值。@ClaudioRedi也将提供与eval相同的结果(“a+b”)@Quentin我处理的是a和b的值动态变化的情况,请不要打开窗口来存储变量。请而是使用
obj=Object.create(null);obj.a=“value1”;obj.b=“然后是两个”;变更(对象a+对象b);//将警告“值1然后两个”
;除了
obj=…
var obj=…
window['obj']=…
 "self.Salary = ko.computed(function(){ return self.salaryEqn() && eval(self.salaryEqn()).toFixed(2); })"
var myobj = {a : 5, b : 10};

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

//gives 15.
alert( myobj[dynamicProperty1] + myobj[dynamicProperty2] );
Object.observe(root, function(newValues) { 
    res = newValues.object.a + newValues.object.b;
});