用if / else自动替换条件运算符?

时间:2013-02-04 15:36:44

标签: javascript regex replace conditional-operator

特定的JS解析器(不在我的控件中)不理解嵌套的条件运算符语法,如下所示:

return num === 1 ? condition ? condition : something : something;

因此,我想用if / else块替换文件中的所有条件运算符(简单和嵌套)。我该怎么办呢? (Textmate或类似的regexp会有所帮助。)

2 个答案:

答案 0 :(得分:5)

  

我该如何解决? (Textmate或类似的正则表达式会有所帮助。

我不认为这对正则表达式是可行的 - 你需要用它们解析整个JS表达式语法。当然,您可以使用它们来查找三元运算符的外观,但需要手动替换它们。

这是因为条件运算符形成表达式,而if / else结构是语句。这意味着你需要在if-else周围解除包含三元运算符的语句。转换一般

有两种解决方案
  

&lt; some statement condition ? then-expression : else-expression < / em>)&gt;

  1.   

    if ( 条件 ) {

         

    &lt; some statement then-expression&gt;

         

    } else {

         

    &lt; some statement else-expression&gt;

         

    }

  2.   

    var helper;

         

    if ( 条件 )

         

    helper = then-expression ;

         

    else

         

    helper = else-expression ;

         

    &lt; some statement helper &gt;

  3. 选择哪一项取决于某些陈述的复杂性(对于您的return - 我选择#1的陈述。由于替换带来了自己的语法规则,您甚至可能需要调整周围的块。所有这些都不是一项微不足道的任务,只有当你已经有一个经过解析的AST进行转换时,imho才能自动完成。

答案 1 :(得分:1)

一个想法是将x ? y : z转换为(x && y) || z。你仍然可能不得不做一些相当花哨的解析来找到三元运算符,但至少你可以将它们作为表达而不是语句,这意味着所需的更改不那么广泛。但请注意,可能存在这两种情况并不完全等效的情况(例如,如果y为0),请谨慎使用此方法,并且只有在您可以控制应用的代码时才使用此方法。

(x && y) || z的想法是,当x为真时,它的计算结果为y,当x为假时,它的计算结果为z。这是由于JavaScript处理非布尔值的短路方式的一些边缘情况。它是标准布尔算术的一种推广。实质上,JavaScript将返回检查所需的最后一个值以执行操作。因此true && (stuff)会返回stuff,而false && (stuff)会返回false。同样,true || (stuff)会返回true,而false || (stuff)会返回stuff

有两种情况需要检查,以显示(x && y) || z(大部分)做了我们想要的事情:

案例1:x是真实的

由于x是真实的,(true && y) || z评估为y || z。如果y也是真实的,那么这将评估为y,我们得到了我们想要的行为。如果y不真实,则操作失败,我们得到z!

案例2:x是假的

由于x是假的,(false && y) || z评估为false || z,而z的评估结果为> var x1 = "a" //truthy > var x2 = "" //falsey > var y = "y" > var z = "z" > (x1 && y) || z "y" > (x2 && y) || z "z" 。在这里,我们很幸运,无论y是什么,总能得到理想的行为。

实施例

以下是Chrome控制台中所需行为的示例:

y

请注意> var y2 = 0 > (x1 && y2) || z "z" 不真实的情况!

 var varificetioncode = 'how-to-send-link-on-html-button-click-in-java-mail';
 var token = "http://stackoverflow.com/questions/43445571/"+varificetioncode;
message.setContent("<h2>Reset password request </h2>" + 
          "<h3> Plaese click on the button to reset password \n </h3> "+
    " <a target='_blank' href="+token+"><button>Reset your password</button></a>","text/html; charset=utf-8");