【问题标题】:Alternative to eval() javascript [duplicate]替代 eval() javascript [重复]
【发布时间】:2013-04-08 20:34:36
【问题描述】:

我主要使用 javascript、Jquery、knout 等工作

eval() 吸引我的地方是

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

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

在我的工作中,我处理了很多来自 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); })"

【问题讨论】:

  • 它不适用于您的示例,但如果您需要的是to evaluate equation obtaining as string into equation as object.,那么您可以使用JSON.parse
  • 一般来说,您应该尽可能避免使用 eval()。检查以下链接以了解您在使用 eval() 时遇到的问题。 ajaxmin.codeplex.com/wikipage?title=Problems%20with%20Evals 更新:检查此stackoverflow 答案以替代 javascript 中的 eval。
  • a + b 为您提供15,而无需将其表示为字符串然后对其进行求值。
  • @ClaudioRedi 也会给出与 eval("a+b") 相同的结果
  • @Quentin 我处理 a 和 b 的值动态变化的情况

标签: javascript jquery jquery-plugins eval


【解决方案1】:

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

【讨论】:

  • 请不要在窗口中存储变量。请。而是使用obj = Object.create(null); obj.a = "value1"; obj.b = " then two"; altert(obj.a + obj.b); // will alert "value1 then two";
  • 除了obj = ...var obj = ...window['obj'] = ... 完全相同
【解决方案2】:

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

如果是这样,请参阅Calculate string value in javascript, not using eval

简而言之:

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

【讨论】:

    【解决方案3】:

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

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

    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 字符串,因此具有几乎无限的灵活性。

    如果您的 ab 变量是全局变量,则浏览器中的 JS 全局变量实际上是 window 对象的子对象,因此即使使用全局变量,您仍然可以使用此技术。

    即您的全局变量a 也可以通过window.awindow['a'] 访问,后一个选项允许您执行与上述相同的dynamicProperty 技巧。

    希望对您有所帮助。

    【讨论】:

      【解决方案4】:

      您似乎正在尝试执行用户创建的动态方程。

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

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

      工作量很大,但有一些预先推出的解决方案。例如math.js

      【讨论】:

        【解决方案5】:

        this questionanother one here 中检查eval 的更多替代方案,它们都可能被视为重复...

        我知道这是一个仅链接的答案,但它肯定会对其他搜索 eval 的替代方案的人有所帮助。

        【讨论】:

          【解决方案6】:

          如果你可以在root = {a: 1, b: 2}这样的对象下收集它们,那么

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-03-30
            • 2016-06-13
            • 2010-10-31
            • 1970-01-01
            相关资源
            最近更新 更多