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