【问题标题】:Can I get the "value" of an arbitrary statement in JavaScript (like eval does, but without eval)我可以在 JavaScript 中获取任意语句的“值”吗(就像 eval 一样,但没有 eval)
【发布时间】:2010-03-17 00:17:12
【问题描述】:

在 JavaScript 中有没有一种方法可以像 function() { return eval("if (true) { 1 }"); } 返回“1”一样获取语句的“值”;

function() { return if (true) { 1 } } 以及我尝试过的所有类似排列都不是有效的语法。

eval 是否拥有特殊的能力来确定表达式中语句的“最后一个”值?

用例是一个 REPL,它计算任意表达式并返回结果。 eval 有效,但我想将它包装在函数中。

【问题讨论】:

    标签: javascript eval


    【解决方案1】:
    function(expr) { return eval(expr); }
    

    但这实际上并没有比eval 做的更多,所以我猜你必须在返回之前对eval 的返回值做一些事情?

    例如:

    function custom_eval(expr) 
    {
      var result = eval(expr);
      if ((typeof result))=="string")
      { 
         alert("The expression returned a string value of: " + result); 
      }
      if ((typeof result))=="number")
      {
         alert("The expression returned a number with value: " + result);
      }
      //and so on and so forth...
      return result;
     }
    
     var bob = custom_eval("x=\"bob\";x");
     alert(bob);
    

    (有关typeof 运算符的更多信息)

    【讨论】:

    • 我不认为这是他要找的东西,但值得一提的是typeof 不是函数,应该用作typeof result 而不是typeof(result)
    • 这仍然使用eval,它执行字符串expr中的任何代码。这可能非常危险,因为 OP 描述该字符串可以包含“任意表达式”。
    • @Marcel :OP 不仅说字符串可以包含任意表达式,OP 还说他想执行那些任意表达式(评估是他的话)。
    • @Marcel:要确定最终表达式的值,必须对其求值(执行),否则 OP 将不得不解决停止问题en.wikipedia.org/wiki/Halting_problem
    • @Mike:很有趣,谢谢你的链接。我不得不承认,如果不使用eval,我也无法解决这个问题。
    【解决方案2】:

    要在 javascript 中评估任意 javascript 代码,您有三个选项

    • 评估。这通常被认为是“危险的”,但由于 javascript 是在客户端的计算机上执行的,它们只能伤害自己(除非您为客户端提供共享代码的方式)。
    • Function 构造函数。同样的问题也适用。
    • 编写一个javascript解释器。这对于“任意”代码来说绝对是棘手的。

    【讨论】:

      【解决方案3】:

      您可以使用 || 来获取不为 null/undefined/0 的 first 值:

      var t = 1 || 'b' || 3 || 'd'; // assigns 1
      
      var t = 0 || null || undefined || 'd'; // assigns d
      

      如果没有先找到短路的 null/undefined/0,则可以使用 && 获取 last 值:

      var t = 1 && 'b' && 3 && 'd'; // assigns d
      
      var t = 0 && null && undefined && 'd'; // assigns 0
      

      【讨论】:

        猜你喜欢
        • 2015-06-22
        • 2010-11-29
        • 2021-10-20
        • 1970-01-01
        • 2011-03-28
        • 1970-01-01
        • 1970-01-01
        • 2019-04-17
        • 2017-12-25
        相关资源
        最近更新 更多