【问题标题】:javascript conditional expression parserjavascript条件表达式解析器
【发布时间】:2014-01-24 09:50:42
【问题描述】:

我正在使用 JavaScript。我想解析和评估条件表达式。 例如:

    var param1=1;
    var param2=2;
    var param3=3;
    var expression="(param1==param2)||(param3<param1)";

我想编写一个函数,它将接受“表达式”作为输入并解析表达式以及评估表达式并返回评估结果。

如有任何建议,请告诉我。

提前致谢。

【问题讨论】:

  • 为什么没有函数表达式作为输入? “条件表达式”从何而来?你想要什么语法?
  • 在我的应用程序中,用户手动输入条件表达式,因此它应该评估。
  • 这些表达式是否仅用于输入它们的用户?如果没有,您不应该使用eval 和合作,而是使用解析器并手动评估它们。语法应该很简单。

标签: javascript


【解决方案1】:

这是邪恶的:eval();

var param1=1;
var param2=2;
var param3=3;
var expression=eval("(param1==param2)||(param3<param1)");

那么你的功能来了,

function myEvaluator(s) {
    return eval(s);
}

表达式中必须有变量 public。

【讨论】:

  • eval 函数没有按条件表达式的预期工作。 var expression=eval(1==2) 它返回 true 而不是 false。
  • 不,它没有,但是使用eval 评估您无法控制的输入是非常危险的。如果你想正确地做到这一点,除了获取或编写自己的布尔语句评估器/解析器之外别无选择。 security.stackexchange.com/questions/94017/…
【解决方案2】:

这是一个非常古老的问题,我很惊讶从那以后没有图书馆可以帮助解决这个问题。

出于必要,我构建了一个名为 angel-eval 的库,它正是这样做的。它解析字符串表达式并使用上下文对象进行评估。它在后台使用名为 Nearley 的解析器生成器,并且不使用 evalnew Function(…)

要使用,请安装:npm i angel-eval

const { evaluate } = require("angel-eval");

evaluate("(param1===param2)||(param3<param1)", { param1: 1, param2: 2, param3: 3 });

angel-eval不支持==!=,所以你需要使用===!==

这是一个沙盒:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    相关资源
    最近更新 更多