Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在此块中用if/else替换嵌套的条件运算符_Javascript_Conditional Operator - Fatal编程技术网

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

Javascript 在此块中用if/else替换嵌套的条件运算符,javascript,conditional-operator,Javascript,Conditional Operator,使用if/else语句而不是三元语句,这个块看起来会是什么样子 返回值==null?名字,本地人?attrNullNS:attrNull:typeof 值=“函数”?名字,本地人?AttrFunctions:attrFunction: 名字,本地人?attrconstants:attrConstant (在处理另外15个类似的块之前,我想确定我是否正确地执行了此操作……理想情况下,我想用一个regexp替换所有这些块,但似乎没有方法?仅通过替换三元运算符就可以快速完成此操作,但我猜它看起来非常像

使用if/else语句而不是三元语句,这个块看起来会是什么样子

返回值==null?名字,本地人?attrNullNS:attrNull:typeof 值=“函数”?名字,本地人?AttrFunctions:attrFunction: 名字,本地人?attrconstants:attrConstant


(在处理另外15个类似的块之前,我想确定我是否正确地执行了此操作……理想情况下,我想用一个regexp替换所有这些块,但似乎没有方法?

仅通过替换三元运算符就可以快速完成此操作,但我猜它看起来非常像这样:

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;
    }
}
好问题

首先,我同意给您留下这段代码的开发人员应该受到惩罚

但是,如果你考虑到这一点,你可以理解(没有代码格式,如In)。

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

  • 返回
    值==null?name.local?attrNullNS:attrNull:typeof value==“function”?name.local?attrnfunctions:attrnfunction:name.local?attrConstantNS:attrConstant
    <
  • 返回(value==null?
    值的类型==“函数”?名称.local?attrnfunctions:attrnfunction:name.local?attrConstantNS:attrcconstant
  • 返回(
    ?(name.local?attrnulns:attrNull):(
    <(
    name.local?attrFunctions: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;
    
    三元运算符和无块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:好的,不仅仅是缩进,而是编辑器的整理/漂亮打印/任何功能。当然,一个条件表达式中只允许一条语句如果不是,但由于原始的三元运算符具有相同的限制,这在这里不是问题-对于转换来说。如果您需要在以后修改代码,大括号可能会很有用,这一点很清楚。