【问题标题】:Replace nested conditional operators with if/else in this block在此块中用 if/else 替换嵌套的条件运算符
【发布时间】:2013-01-19 12:43:16
【问题描述】:

如果使用 if/else 语句而不是三元语句,这个块会是什么样子?

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

(我想确定在处理另外 15 个类似的块之前我这样做是正确的......理想情况下,我想用正则表达式替换所有这些块,但似乎没有方法?Replace conditional operator with if/else automatically?

【问题讨论】:

    标签: javascript conditional-operator


    【解决方案1】:

    只需替换三元运算符就可以做到这一点非常快,但我猜它看起来很像这样:

    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】:

      好问题。

      首先,我同意给你留下这段代码的开发者应该是 LARTed。

      但是,如果您考虑到 the syntax for the Conditional Operator is LogicalORExpression ? AssignmentExpression : AssignmentExpression or … : AssignmentExpressionNoInthe longest possible match wins,您可以解决这个问题(没有代码格式化程序,例如 Eclipse JSDT)。

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

      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) : (name.local ? attrConstantNS : attrConstant) ));

      所以:

      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;
          }
        }
      }
      

      (CMIIW.) 这可以进一步简化为

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

      【讨论】:

        【解决方案3】:

        三元运算符和无块 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;
        

        【讨论】:

        • 希望他们最终会得到包含大括号的东西。
        • @PointedEars:如果您认为它们提高了可读性,您的自动缩进应该能够添加它们。我故意省略了它们以表明我的观点,即无括号条件语句非常类似于无括号三元运算符。
        • 你在说什么?单独的自动缩进不能自动添加大括号。比可读性更重要的是可维护性。当不仅有一个语句依赖于条件表达式时,此代码将开始失败。
        • @PointedEars:好的,不仅仅是缩进,而是编辑器的整洁/漂亮打印/任何功能。当然,if-else 中只允许使用一个语句,但由于原始三元运算符具有相同的限制,这在这里不是问题 - 对于转换。如果您需要稍后修改代码,大括号可能有用,这很清楚。
        猜你喜欢
        • 2013-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-17
        • 1970-01-01
        • 2019-10-20
        • 2023-03-03
        • 1970-01-01
        相关资源
        最近更新 更多