【问题标题】:Shorthand for if-else statementif-else 语句的简写
【发布时间】:2013-08-18 14:56:06
【问题描述】:

我有一些代码,其中包含很多类似于此的 if/else 语句:

var name = "true";

if (name == "true") {
    var hasName = 'Y';
} else if (name == "false") {
    var hasName = 'N';
};

但是有没有办法让这些语句更短?类似? "true" : "false" ...

【问题讨论】:

  • 这与 jQuery 无关,jQuery 是 JavaScript 的 DOM 操作库。
  • 你为什么用“真”这个词,而不是布尔值true
  • 不是我的问题,对不起。

标签: javascript if-statement


【解决方案1】:

使用ternary :? operator [spec]

var hasName = (name === 'true') ? 'Y' :'N';

三元运算符让我们可以完全按照您的意愿编写速记 if..else 语句。

看起来像:

(name === 'true') - 我们的条件

? - 三元运算符本身

'Y' - 条件为真时的结果

'N' - 条件评估为假时的结果

简而言之 (question)?(result if true):(result is false) ,如您所见 - 它返回表达式的值,因此我们可以简单地将其分配给变量,就像上面的示例一样。

【讨论】:

  • 它不能很好地扩展,看看我的答案或@BenjaminGruenbaum 的答案
  • 有几个原因,首先,您将"' 混合用于字符串文字,这会产生一种错误观念,即它们以某种方式代表不同的事物。其次使用== 运算符is frowned upon。此外,内联三元块比 if 语句更难阅读(我更喜欢原始代码),并且在许多公司中不通过代码审查。此外,您的间距已关闭。
  • @TusharGupta 谢谢,伙计。
  • @TusharGupta 感谢您修复它,我已经做了一些澄清(特别是格式化和添加指向规范和参考的链接)。随意还原您不喜欢的任何更改。
  • @Adam - 使用三个符号要求值具有相同的 type 以及相同的 value 而使用两个符号会做在检查值之前进行转换: 2 == '2' 将评估为 true,即使一个是字符串而另一个是数字。 2 === '2' 将评估为假,因为这两个值的类型不同。如果需要,请在此处快速演示 :) jsfiddle.net/c5fabevq
【解决方案2】:

您可以将对象用作地图:

  var hasName = ({
        "true"  : "Y",
        "false" : "N"
  })[name];

这也适用于许多选项

  var hasName = ({
        "true"          : "Y",
        "false"         : "N",
        "fileNotFound"  : "O"
  })[name];

(获得参考的人的奖励积分)

注意:对于表示真值的变量,您应该使用实际的布尔值而不是字符串值“true”。

【讨论】:

  • (当然,地图不必是匿名的,如果你命名它,在大多数非显而易见的情况下,这对于可读性会更好,可读的代码比较短的代码更重要。虽然我们所有人都想写简洁的代码——永远不应该以清晰为代价)
  • 不错的解决方案!不会想到的。但我猜想使用索引运算符会在机器代码中产生相同的 if/elseif 构造。
  • @JoSo 这取决于实现,但在聪明的运行时它们会同样快:) 我使用这个构造代替 switch... 字符串上的大小写。
  • 我同意带字符串的开关可能同样快/慢。在任何其他情况下(整数、布尔值),切换会更快,因为 CPU 的 ALU 可以轻松处理它。如果您必须在 JavaScript 中考虑这一点 - 我不知道。
【解决方案3】:

试试这个

hasName = name ? 'Y' : 'N';

【讨论】:

    【解决方案4】:

    试试看

    var hasName = 'N';
    if (name == "true") {
        hasName = 'Y';
    }
    

    或者甚至尝试使用ternary operator 喜欢

    var hasName = (name == "true") ? "Y" : "N" ;
    

    简单的也可以试试

    var hasName = (name) ? "Y" : "N" ;
    

    因为名称有 YesNo 但我不确定。

    【讨论】:

      【解决方案5】:

      如果您的 if-else 中只有 two 条件,这里的大多数答案都可以正常工作。对于我猜你想要的更多信息,你将使用数组。 names 数组中的每个名称对应的元素,您将在hasNames 数组中拥有一个具有完全相同索引的元素。那么就是这四行的问题了。

      names = "true";
      var names = ["true","false","1","2"];
      var hasNames = ["Y","N","true","false"];
      var intIndex = names.indexOf(name);
      hasName = hasNames[intIndex ];
      

      这个方法也可以使用illustrated by Benjamin这样的对象和属性来实现。

      【讨论】:

        【解决方案6】:

        ?:运算符

        如果你想缩短 If/Else,你可以使用 ?: 操作符:

        condition ? action-on-true : action-on-false(else)
        

        例如:

        let gender = isMale ? 'Male' : 'Female';
        

        在这种情况下,else 部分是强制性的。

        && 运算符

        在另一种情况下,如果您只有if 条件,您可以使用&& 运算符作为:

        condition && action;
        

        例如:

        !this.settings && (this.settings = new TableSettings());
        

        仅供参考:您必须尽量避免使用 if-else 或至少减少使用它,并尝试将其替换为 Polymorphism 或继承。成为Anti-If的家伙。

        【讨论】:

          【解决方案7】:

          试试这个方法;

          速记法:

          let variable1 = '';
          
          let variable2 = variable1 || 'new'
          console.log(variable2); // new

          速写法:

           let variable1 = 'ya';
           let varibale2;
          
           if (variable1 !== null || variable1 !== undefined || variable1 !== '')
                 variable2 = variable1;
          
          console.log(variable2); // ya

          【讨论】:

            最近更新 更多