【问题标题】:Convert variable string value to expression in JavaScript将变量字符串值转换为 JavaScript 中的表达式
【发布时间】:2017-01-18 11:24:00
【问题描述】:

我正在尝试将字符串值转换为表达式,以便我可以在 if 条件中使用它:

var StringVal = '20 > 18 && "yes" == "yes"';

if(StringVal){

    ....
}

是否可以这样做,请建议我。

谢谢

【问题讨论】:

  • eval 会这样做,或者很可能是 Function 等效项。
  • 是的..但它不适用于"yes" == "yes"
  • 为什么需要这样做?
  • 我正在开发一些调查应用程序并从网络服务中获得:[[abc]] > 18 && [[xyz]] == "yes" [[abc]] 和 [[xyz]] 代表以前的问题答案,我只是替换了那个 [[。 .]] 字符串转换为实际值,然后我必须检查条件..
  • 我认为 eval 正在工作......

标签: javascript


【解决方案1】:

从用户来源获取输入并对其进行评估通常并不安全,但您可以使用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 之前执行了一些清理操作。

【讨论】:

  • 不要使用这种方法!这是危险和不必要的。
  • 这回答了 OP 问题,并指出这通常不是一种安全的方法,我觉得没有必要投反对票。
  • 这是因为 OP 不应该这样做。 OP 不知道正确的处理方法,您正在鼓励不良做法。
  • 不,我不鼓励不良做法。
  • 请注意,这不会识别像 'true);(0' 这样的语法错误。
【解决方案2】:

你可以使用函数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

【讨论】:

    【解决方案3】:

    请注意,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 + ";") 检查表达式不包含无效的) 以转义换行括号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多