未定义属性上的javascript eval表达式

问题描述 投票:0回答:1

我需要检查用户是否通过了公式,并使用了对象内部定义的一组受限的属性/值。对象属性是:

var klarf = {
   InspectedDiceCount: 0,
   FailedDiceCount: 0,
   PassedDiceCount: 0,
   UnclassifiedDiceCount: 0,
   InspectedDefectCount: 0,
   FailedDefectCount: 0,
   PassedDefectCount: 0,
   UnclassifiedDefectCount: 0
}

用户必须键入任何返回布尔值的数学表达式,才能将公式al“有效”:]

validate = eval(10 + klarf.PassedDiceCount > 100);  //returns false (but valid formula)
validate = eval(klarf.InspectedDiceCount > klarf.FailedDiceCount + 1); //return true (but valid formula)

如果用户指定未定义的属性或未定义/不允许的变量,我怎么能抓住错误?

validate = eval(10 + klarf.dummy > 0);    //returns true (but expected invalid formula)
validate = eval(a > b);

如果不通过eval,是否有任何js库可以执行公式评估?

目标是检索以input text形式键入的用户公式,然后检测是否:a)公式有效(无论结果为真还是假),因为它仅使用允许的变量。有效公式例如:

(klarf.InspectedDiceCount > 10)
(1 > 2)
((klarf.UnclassifiedDefectCount * 100 / klarf.InspectedDefectCount) > 0.1)

b)公式无效,因为其中包含未声明的变量或klarf对象属性。无效的公式例如:

klarf.PropertyThatDoesNotExists > 0
dummy_variable > 1
clarf.FailedDiceCount < 16

这是我正在处理的js validate公式:

function validate () {
    expr = "result = " + $('#rule_formula').val();
    r = eval(expr);
    console.log(expr, r, result);
    try {
        r = eval("result = " + $('#rule_formula').val());
    } catch(err) {
        $('#rule_validation').html("Invalid rule. Error (" + err.message + ") detected").css({
            'font-weight': 'bold',
            'color': 'red'
        });
    }
    if (typeof result == "boolean") {
        $('#rule_validation').html("Rule is valid").css({
            'font-weight': 'bold',
            'color': 'green'
        });
    } else {
        $('#rule_validation').html("Invalid rule. Boolean (true/false) output expected").css({
            'font-weight': 'bold',
            'color': 'red'
        });
    }
}
javascript eval
1个回答
-1
投票
if( obj.z ){
   validate = eval(10 + obj.z > 0);    //returns true (but expected invalid formula)
}else{
  // in valid formula 
}

为什么不尝试这个?

© www.soinside.com 2019 - 2024. All rights reserved.