不寻常的问题,也许我不正确地处理这个问题-
我想对Javascript中的一些数值进行比较,但是我将比较器存储在数据库中(在VARCHAR字段中),其中存储了特定的标准。(比较器为<=、<、==、>、>=等)。
有没有一种方法来计算JS中作为比较器返回的字符串?
谢谢
发布于 2016-11-21 09:36:51
是,但是除非您将它与完全信任的数据一起使用,否则不要使用它。
相反,实现以下比较:
function compare(operator, operand1, operand2) {
switch (operator) {
case "<=":
return operand1 <= operand2;
case ">=":
return operand1 >= operand2;
// ...and so on...
}
}但是,如果完全信任数据,则可以使用eval
function compare(operator, operand1, operand2) {
return eval("operand1 " + operator + " operand2");
}(这看起来像伪代码,但事实并非如此;eval在调用它的上下文中计算给它的代码字符串,因此它可以访问operand1和operand2参数。)
“信任”部分非常非常重要,因为eval允许执行任何脚本代码。如果您允许Bob提供最终将由Alice在浏览器中计算的数据,不使用使用eval。这对爱丽丝来说是个重大的安全风险。
发布于 2016-11-21 09:35:37
是的,您可以使用以比较器作为键的对象,并返回用于进行比较的函数。
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; }
}用法:
(comparison[comp] || comparison.default)(value1, value2);发布于 2016-11-21 09:37:00
更好的方法是编写自己的compare方法,并在DB上保留结果/代码,如下所示
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上的代码必须是一个键。
https://stackoverflow.com/questions/40716835
复制相似问题