我正在尝试将字符串值转换为表达式,以便我可以在条件中使用它,如:
var StringVal = '20 > 18 && "yes" == "yes"';
if(StringVal){
....
}
是否可以这样做,请建议我。
由于
答案 0 :(得分:6)
从用户来源获取输入并对其进行评估通常不安全,但您可以使用Function
评估或eval
var StringVal = '20 > 18 && "yes" == "yes"';
if (new Function('return (' + StringVal + ')')()) {
console.log('ok');
}

Are eval() and new Function() the same thing?
更新:如果您可以在问题中提供有关您认为必要的更多信息以及实际代码的示例,则可以建议更安全的解决方案。
此外:在JSON2
中,eval
JSON.parse
https://github.com/douglascrockford/JSON-js/blob/master/json2.js#L491
但您还会注意到在调用eval
之前会执行一些清理。
答案 1 :(得分:3)
您可以使用功能eval()
试试这个:
var StringVal = '20 > 18 && "yes" == "yes"';
if(eval(StringVal)){
....
}
其他例子:
var a = '1==3'
var b = '1==1'
console.log(eval(a));
// false
console.log(eval(b));
// true
答案 2 :(得分:2)
请注意,eval
不会直接将您的文本解析为表达式,例如
eval('{}'); // undefined
那是因为{}
被解析为块,而不是对象初始化表达式。
有几种方法可以强制将其解析为表达式,例如在括号内嵌套,或通过return
语句。所以我会用
function evalExpr(expr) {
Function("return " + expr + ";");
return eval("(" + expr + ")");
}
console.log(evalExpr('{}')); // Object {}
try { evalExpr('1),(2') } catch(err) { console.error(err); } // SyntaxError
try { evalExpr('1;2') } catch(err) { console.error(err); } // SyntaxError
eval("(" + expr + ")")
计算为表达式,之前Function("return " + expr + ";")
检查表达式是否包含无效的)
以逃避包装括号。