eval()javascript的替代方案
我主要使用javascript、Jquery、knockout等 吸引eval()的是 注意:我在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数
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
变量是对象的一部分,则可以使用字符串下标访问它们:
iemyobj.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;
});