用此块中的if / else替换嵌套的条件运算符

时间:2013-02-04 18:30:39

标签: javascript conditional-operator

这个块使用if / else语句而不是三元组会是什么样的?

  

返回值== null? name.local? attrNullNS:attrNull:typeof   值===“功能”? name.local? attrFunctionNS:attrFunction:   name.local? attrConstantNS:attrConstant;

(我想确定我在处理另外15个类似的块之前做到了这一点...理想情况下我想用regexp替换所有这些块,但似乎没有方法?Replace conditional operator with if/else automatically?

3 个答案:

答案 0 :(得分:2)

好问题。

首先,我同意向您提供此代码的开发人员应该是LARTed。

但是,如果您考虑Eclipse JSDTthe syntax for the Conditional Operator is LogicalORExpression ? AssignmentExpression : AssignmentExpression or … : AssignmentExpressionNoIn,则可以解决此问题(没有the longest possible match wins中的代码格式化程序)。

属于同一原子条件操作的相邻表达式不能由两个侧的?:分隔,因为语法不允许这样做。因此,只需将自己置于LL(n)解析器的位置,该解析器根据ECMAScript语法工作;-)反复问自己“这个代码是否可以由该目标符号的生产产生?”;如果答案为“否”,则回溯到较短的匹配,直到可以,或者如果没有生产工作则会出现语法错误。

  1. return ( value == null ? name.local ? attrNullNS : attrNull : typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant ) ;
  2. return (value == null ? ( name.local ? attrNullNS : attrNull ) : ( typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant ) );
  3. return ( ( value == null ) ? (name.local ? attrNullNS : attrNull) : ( ( typeof value === "function" ) ? ( name.local ? attrFunctionNS : attrFunction {{1} } ) : ( name.local ? attrConstantNS : attrConstant )
  4. 所以:

    ));

    (CMIIW。)这可以进一步减少到

    if (value == null)
    {
      if (name.local)
      {
        return attrNullNS;
      }
      else
      {
        return attrNull;
      }
    }
    else
    {
      if (typeof value === "function")
      {
        if (name.local)
        {
          return attrFunctionNS;
        }
        else
        {
          return attrFunction;
        }
      }
      else
      {
        if (name.local)
        {
          return attrConstantNS;
        }
        else
        {
          return attrConstant;
        }
      }
    }
    

答案 1 :(得分:0)

通过更换三元运算符真的很快,但我猜它看起来很像这样:

if (value == null) {
    if (name.local) {
        return attrNullNS;
    }else{
        return attrNull;
    }
}else if (typeof value === "function") {
    if (name.local) {
        return attrFunctionNS;
    }else{
        return attrFunction;
    }
}else{
    if (name.local) {
        return attrConstantNS;
    }else{
        return attrConstant;
    }
}

答案 2 :(得分:0)

三元运算符和无块if-else语句的语法(“分组”)非常相似,因此您可以先将每个… ?替换为if (…),将每个:替换为else return。然后在每个语句周围包装if (value == null) if (name.local) return attrNullNS; else return attrNull; else if (typeof value === "function") if (name.local) return attrFunctionNS; else return attrFunction; else if (name.local) return attrConstantNS; else return attrConstant; 语句,并使用自动缩进。也许您甚至可以通过自动替换仔细(逐步)完成其中的一些任务。你最终会得到

{{1}}