3

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

返回值 == 空?名称.local ? attrNullNS : attrNull : typeof value === "function" ? 名称.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;

(我想确定在处理另外 15 个类似块之前我这样做是正确的......理想情况下,我想用正则表达式替换所有这些块,但似乎没有方法? 用 if/else 自动替换条件运算符? )

4

3 回答 3

2

好问题。

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

但是,如果您认为条件运算符的语法是or并且最长可能的匹配获胜,您可以弄清楚这一点(没有Eclipse JSDT等代码格式化程序) 。LogicalORExpression ? AssignmentExpression : AssignmentExpression… : AssignmentExpressionNoIn

属于同一原子条件操作的相邻表达式不能在两边用 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;
于 2013-02-04T19:52:54.380 回答
0

三元运算符和无块 if-else 语句的语法(“分组”)非常相似,因此您可以先将 each 替换… ?为,将if (…)each:替换为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;
于 2013-02-04T20:05:17.493 回答
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;
    }
}
于 2013-02-04T18:46:48.643 回答