Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自字符串的Javascript布尔比较器_Javascript_Sql_Boolean - Fatal编程技术网

来自字符串的Javascript布尔比较器

来自字符串的Javascript布尔比较器,javascript,sql,boolean,Javascript,Sql,Boolean,这里有一个不寻常的问题,也许我处理这个问题的方法不对- 我想对Javascript中的一些数值进行比较,但我将比较器存储在数据库中(在VARCHAR字段中),其中存储了特定的条件。(比较器为=,等等) 有没有一种方法可以评估JS中作为比较器返回的字符串 谢谢是的,您可以使用带有比较器的对象作为键,并返回用于进行比较的函数 var comparison = { '<=': function (a, b) { return a <= b; }, '<': func

这里有一个不寻常的问题,也许我处理这个问题的方法不对-

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

有没有一种方法可以评估JS中作为比较器返回的字符串


谢谢

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

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; }
}

这里有,但是除非您使用的是完全可信的数据,否则不要使用它

相反,执行以下比较:

函数比较(运算符、操作数1、操作数2){
开关(操作员){
案例“=”:
返回操作数1>=操作数2;
//……等等。。。
}
}
但是,如果您完全信任数据,您可以使用:

函数比较(运算符、操作数1、操作数2){
返回值(“操作数1”+运算符+“操作数2”);
}
(这看起来像伪代码,但它不是;
eval
在调用它的上下文中计算您给它的代码字符串,因此它可以访问
operan1
operan2
参数。)


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

更好的方法是编写自己的
比较
方法,并将结果/代码保存在DB上,比如

function compare(a, b):
    if( a < b ) return -2;
    else if (a <= b) return -1; 
    else if ( a == b) return 0;
    //...
功能比较(a,b):
如果(a否则如果(a您可以使用
eval
功能

var a=10;
var b=20;

var comparator='您可以使用jquery ajax调用从服务器端代码中检索字符串运算符,然后在javascript代码中计算字符串以进行比较

<script>
$(document).ready(function(){
    $.ajax({url: "retrieveOperator.php", success: function(result){

    switch(String(result)) {
        case "==":
            code block for == operator
            break;
        case ">=":
            code block for >= operator
            break;
        default:
            default code block
    }   
    });
});
</script>

$(文档).ready(函数(){
$.ajax({url:“retrieveOperator.php”),成功:函数(结果){
开关(字符串(结果)){
案例“==”:
==运算符的代码块
打破
案例“>=”:
>=运算符的代码块
打破
违约:
默认代码块
}   
});
});

eval
函数。在这里阅读有关它的内容,如果您正在比较字符串,它将只比较第一个字符(如果第一个字符与第二个字符相同),等等。如果您要比较数值,请使用类似于
开关(cmp)案例“我有开关()解决方案已经实现,但我想我应该在这里扩展这个问题,以找到一个更“纯粹”的解决方案函数。谢谢大家谢谢尼娜,我正在考虑做类似的事情-但我想知道是否有更深入的方法来计算字符串作为布尔比较器?这取决于。你有没有一个例子?看看上面的TJs答案,eval()函数执行代码,而不管它是否可信。在我看来,我试图识别类似于将字符串转换为布尔值的东西,而是作为比较器/operator@N15M0_jk:Nina上面的mapping对象与此非常接近。它基本上可以让你得到一个与操作符等价的函数。我可能会把这个map包装起来n函数:
function getOperator(opname){return comparison[opname]| | comparison.default;}
然后使用它:
var op=getOperator(“>=”);if(op(operator 1,operator 2)){…}
这很像我的
比较
函数和
开关
,但是倒置,将每个运算符封装为一个函数。这很有意义;在comp-sci级别,运算符是函数,只是具有更方便的符号的函数。感谢TJ,我们正在寻找类似这样的东西:)就您为compare函数提供的代码示例而言,由于文字的位置,操作数1和操作数2是否不会完全作为字符串计算?@N15M0\u jk:不,它们不会转换为字符串(在上面的代码中)。它们会保留传递到
compare
时的任何类型。
var a = 10;
var b = 20;
var comparator = '<=';
var result = eval(a + comparator + b)
// true
<script>
$(document).ready(function(){
    $.ajax({url: "retrieveOperator.php", success: function(result){

    switch(String(result)) {
        case "==":
            code block for == operator
            break;
        case ">=":
            code block for >= operator
            break;
        default:
            default code block
    }   
    });
});
</script>