【问题标题】:Translate String to operation in javascript将字符串转换为 javascript 中的操作
【发布时间】:2015-12-01 15:16:22
【问题描述】:

有没有办法翻译以下逻辑操作(由于用户输入而使用字符串)?还是我必须检查每一种可能性? (> == =

var x = 5;
var y = 3;
var operator = '>'

if (x operator y)
  doSomething();

    |
    |
    v

if (x > y)
  doSomething();

【问题讨论】:

  • 你可以使用 eval(),但这对用户输入是不利的。

标签: javascript coffeescript logical-operators


【解决方案1】:

是的,有一个对象和适当的函数,比如

var comparer = {
    '>': function (a, b) { return a > b; }
};

用途:

if (comparer[operator](x, y)) {
    doSomething();
}

【讨论】:

    【解决方案2】:

    你可以使用eval,前提是你知道它是邪恶的。尽管您绝对应该检查输入是否有效,例如检查它是否仅包含 '>

    【讨论】:

    • eval 非常适合这个目的(在测试时),不确定我们上线时是否真的安全
    • 是否可以与其他人共享此输入,例如通过 URL?在这种情况下避免它,完全放弃这个答案。如果用户必须自己填写值,例如在文本字段中,我个人认为没有任何问题。当您可以欺骗其他人执行任意脚本时,这是一个问题,当它只是您自己的客户端时,它是无害的。
    • 它将用于网络应用程序,用户可以在其中创建自己的小型(简单)应用程序以使用数据。
    【解决方案3】:

    你应该改变你的方式。
    使用eval,您必须将所有操作员列入白名单并清理两个输入。

    根据您的需要构建您自己的界面。
    可能会switch

    switch (operator) {
      case '>': if (x > y) doSomething();
    }
    

    可能更抽象一些,例如:

    ifArg(x).relatedWith(y).as(operator).then(doSomething);  
    

    甚至您可能会编写自己的小型解释器(解析器/词法分析器),您的用户也可以在其上编写程序。

    它将用于用户可以在其中创建自己的 Web 应用程序 用于使用数据的小型(简单)应用程序。 ——马修布劳尔斯

    你不应该在这里使用eval

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-29
      • 2022-07-21
      • 2017-06-28
      • 2015-05-07
      • 1970-01-01
      • 2015-02-18
      • 2021-09-06
      • 1970-01-01
      相关资源
      最近更新 更多