Javascript 是否自动将条件运算符替换为if/else?

Javascript 是否自动将条件运算符替换为if/else?,javascript,regex,replace,conditional-operator,Javascript,Regex,Replace,Conditional Operator,特定的JS解析器(不在我的控制范围内)不理解嵌套条件运算符语法,如下所示: return num === 1 ? condition ? condition : something : something; 因此,我想用if/else块替换文件中的所有条件运算符(简单和嵌套)。我该怎么做呢?(Textmate或类似文件的regexp会有所帮助。) 我该怎么做呢?(Textmate或类似文件的regexp会有所帮助 我认为正则表达式不可能做到这一点——你需要用它们解析整个JS表达式语法。当然,你

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

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

我该怎么做呢?(Textmate或类似文件的regexp会有所帮助

我认为正则表达式不可能做到这一点——你需要用它们解析整个JS表达式语法。当然,你可以用它们来查找三元运算符的外观,但替换它们需要手工完成

这是因为条件运算符形成表达式,而if/else结构是语句。这意味着您需要在if-else周围提升包含三元运算符的语句。有两种解决方案可以转换一般表达式

  • if(
    条件
    ){

    }其他{

    }

  • var-helper;

    if(
    条件

    helper=
    然后是表达式

    else

    helper=
    else表达式


  • 选择哪一个取决于some语句的复杂性(对于
    返回的
    -语句,我会选择#1)。由于替换带来了自己的语法规则,您甚至可能需要调整周围的块。所有这些都不是一项简单的任务,只有在您已经有一个解析的AST进行转换的情况下,imho才能实现自动化。

    一个想法是将
    x?y:z
    转换为
    (x&&y)| | z
    。您可能仍然需要进行一些相当奇特的解析来找到三元运算符,但至少可以将它们作为表达式而不是语句,这意味着所需的更改要少得多。但是,请注意,在某些情况下,这两种情况可能并不完全相同(例如,如果
    y
    为0),请谨慎使用此方法,并且仅当您可以控制将应用于哪些代码时

    (x&y)的思想| | z
    是当x为真时,它计算为y,当x为假时,它计算为z。这是由于JavaScript处理非布尔值短路的一些边缘情况。这是标准布尔算术的一种推广。本质上,JavaScript将返回检查i所需的最后一个值n为了执行该操作。因此
    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
    。在这里,我们很幸运,不管y是什么,都能获得所需的行为

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

    > var x1 = "a" //truthy
    > var x2 = "" //falsey
    > var y = "y"
    > var z = "z"
    > (x1 && y) || z
    "y"
    > (x2 && y) || z
    "z"
    
    请注意
    y
    不真实的情况

    > var y2 = 0
    > (x1 && y2) || z
    "z"
    

    因此它是有效的(try
    1?2?3:4:5
    ),但子表达式中的
    返回值看起来可疑(try
    1?2?3:return 4:return 5
    )“@chris Fair,只是在试验它——我不确定。至于
    返回值
    s,我想他基本上是指exp的值为'yield'。不过,将内部表达式括起来比完全改为
    if
    /
    else
    @ChrisJester-Young,对不起,子表达式中的返回值不是为了b问题只是用if/else替换条件运算符表达式。代码是有效的JS。你是说
    if(x){return y;}else{return z;}
    ?@bowl0stu我不知道你的意思。那将是一个语句而不是一个表达式,对吗?通过坚持使用短路布尔运算,你可以将它保留为一个表达式。我不理解
    (x&&y)的用途| | z
    。想解释一下吗?@bowl0stu当然,我在答案上加了一个解释,如果有什么东西不干净,请告诉我。伙计。以前从未听说过短路;有趣的概念