首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串Javascript布尔比较器

问字符串Javascript布尔比较器
EN

Stack Overflow用户
提问于 2016-11-21 09:32:57
回答 5查看 708关注 0票数 3

不寻常的问题,也许我不正确地处理这个问题-

我想对Javascript中的一些数值进行比较,但是我将比较器存储在数据库中(在VARCHAR字段中),其中存储了特定的标准。(比较器为<=、<、==、>、>=等)。

有没有一种方法来计算JS中作为比较器返回的字符串?

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-11-21 09:36:51

是,但是除非您将它与完全信任的数据一起使用,否则不要使用它。

相反,实现以下比较:

代码语言:javascript
复制
function compare(operator, operand1, operand2) {
    switch (operator) {
        case "<=":
            return operand1 <= operand2;
        case ">=":
            return operand1 >= operand2;
        // ...and so on...
    }
}

但是,如果完全信任数据,则可以使用eval

代码语言:javascript
复制
function compare(operator, operand1, operand2) {
    return eval("operand1 " + operator + " operand2");
}

(这看起来像伪代码,但事实并非如此;eval在调用它的上下文中计算给它的代码字符串,因此它可以访问operand1和operand2参数。)

“信任”部分非常非常重要,因为eval允许执行任何脚本代码。如果您允许Bob提供最终将由Alice在浏览器中计算的数据,不使用使用eval。这对爱丽丝来说是个重大的安全风险。

票数 1
EN

Stack Overflow用户

发布于 2016-11-21 09:35:37

是的,您可以使用以比较器作为键的对象,并返回用于进行比较的函数。

代码语言:javascript
复制
var comparison = {
    '<=': function (a, b) { return a <= b; },
    '<':  function (a, b) { return a < b; },
    '==': function (a, b) { return a == b; },
    '>':  function (a, b) { return a > b; },
    '>=': function (a, b) { return a >= b; },
    default: function () { return false; }
}

用法:

代码语言:javascript
复制
(comparison[comp] || comparison.default)(value1, value2);
票数 3
EN

Stack Overflow用户

发布于 2016-11-21 09:37:00

更好的方法是编写自己的compare方法,并在DB上保留结果/代码,如下所示

代码语言:javascript
复制
function compare(a, b):
    if( a < b ) return -2;
    else if (a <= b) return -1; 
    else if ( a == b) return 0;
    //...

然后在db上保留0、-1、-2的值。

现在,如果您想从您的DB中应用一些比较器,只需对您的字符串调用compare,并检查结果是否与来自DB的代码相同(它将给出真假)

这里唯一的问题是,您需要在dataset上触发所有比较,但是它是完全安全的,并且还会处理一些不合适的运算符(不能应用于字符串)--唯一的要求是DB上的代码必须是一个键。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40716835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档