32

我主要使用 javascript、Jquery、knout 等

吸引我 eval() 的是

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

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

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

当我必须将作为字符串获取的方程评估为作为对象的方程时,我进行了很多搜索,但没有找到 eval() 的任何替代品。

任何人都可以建议一个插件或函数替代 eval() 记住我上面给出的例子

问题:

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

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); })"
4

6 回答 6

26

在这方面,Javascript 是一种非常灵活的语言。在少数情况下,eval()任何给定问题的正确答案都是正确的,这里当然没有必要。

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

iemyobj.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.aor访问window['a'],后一个选项允许您执行上述相同的dynamicProperty技巧。

希望有帮助。

于 2013-04-16T13:15:27.123 回答
5

你的意思是你想计算一个等式,直到你收到它才能知道?

如果是这样,请参阅在 javascript 中计算字符串值,而不是使用 eval

简而言之:

eval 有时可以使用,但前提是方程字符串来自受信任的来源,并且您需要像评估动态方程这样的东西。

于 2013-04-16T12:56:53.787 回答
2

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

于 2013-04-16T12:32:39.540 回答
1

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

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

可以在或更改时使您的res变量保持最新ab

于 2015-12-11T14:23:54.360 回答
0

检查这个问题eval的更多替代方案和另一个可能被认为是重复的替代方案......

我知道这是一个仅链接的答案,但它肯定会有助于其他人搜索eval.

于 2015-12-11T10:03:28.917 回答
0

看起来您正在尝试执行用户创建的动态方程。

例如,它可能是“a+b+c”或“dog+cat”,而你不知道。

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

这是很多工作,但有预先推出的解决方案。例如,math.js

于 2015-10-20T17:57:19.230 回答