if-else语句的速记方式

60

我有一些类似于这样的包含很多if/else语句的代码:

var name = "true";

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

但是有没有一种方法可以使这些语句更短?就像? "true" : "false"...


7
这与 jQuery 没有任何关系,jQuery 是用于 JavaScript 的 DOM 操作库。 - Benjamin Gruenbaum
6
为什么你使用词语“true”,而不是布尔值true - Rich Bradshaw
不好意思,这不是我的问题。 - Meek
8个回答

159

使用三元运算符:?[规范]

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

三元运算符使我们能够编写缩写的 if..else 语句,就像您想要的那样。

它看起来像:

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

? - 三元运算符本身

'Y' - 如果条件计算结果为 true 的结果

'N' - 如果条件计算结果为 false 的结果

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


1
它的可扩展性不是很好,看看我的答案或@BenjaminGruenbaum的答案。 - Abijeet Patro
首先,您混合使用"'表示字符串文字的方式是错误的,这会让人误以为它们代表不同的东西。其次,使用==运算符是不被推荐的。此外,内联三元块比if语句更难阅读(我更喜欢原始代码),并且在许多公司的代码审查中不会通过。另外,您的间距有问题。 - Benjamin Gruenbaum
@BenjaminGruenbaum 我只是在要求他接受答案,而不是我的答案,他有选择权来选择答案。我只是希望他接受任何人的答案并结束这个话题。 - Tushar Gupta - curioustushar
1
@TusharGupta 谢谢你修复它,我进行了一些澄清(特别是格式和添加规范和参考链接)。随意撤销您不喜欢的任何更改。 - Benjamin Gruenbaum
1
@Adam - 使用三个符号需要值的类型和值都相同,而使用两个符号则会在检查值之前进行转换: 2 == '2' 将评估为 true,即使一个是字符串,另一个是数字。 2 === '2' 将评估为 false,因为这两个值的类型不同。如果您想要快速演示,请点击此处:https://jsfiddle.net/c5fabevq/ - Mark Townsend
显示剩余3条评论

30

你可以使用对象作为映射表:

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

这也适用于许多选项的良好扩展性

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

(对于能够理解这个引用的人,将会获得额外的加分)

注意:在表示真值的变量中,应该使用实际的布尔值而不是字符串值 "true"。


1
当然,映射不必是匿名的,如果你为它命名,在大多数非明显情况下更易于阅读,可读性比更短的代码更重要。虽然我们都想编写简洁的代码,但它永远不应该以清晰度为代价。 - Benjamin Gruenbaum
2
不错的解决方案!我想不到那个。但我猜使用索引运算符将会在机器代码中得到相同的if/elseif结构。 - konqi
@JoSo 这取决于具体的实现方式,但在聪明的运行时上它们的速度是相同的 :) 我经常使用这种结构来代替字符串的 switch... case。 - Benjamin Gruenbaum
我同意使用字符串的switch语句可能会同样快/慢。在其他情况下(整数,布尔值),switch语句会更快,因为CPU的ALU可以轻松处理它。如果你需要在JavaScript中考虑这一点 - 我不知道。 - konqi

21

试一下这个

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

19

?: 运算符

如果您想缩短 if/else 语句,可以使用 ?: 运算符,如下:

condition ? action-on-true : action-on-false(else)
例如:
let gender = isMale ? 'Male' : 'Female';

在这种情况下,else部分是必需的。

我看到这种缩写格式被用于检查null/undefined,例如:

const avatarName = user.firstname ? user.firstname : user.lastname;

然而,在这种情况下,您可以简单地使用:

const avatarName = user.firstname ?? user.lastname;
或者
const avatarName = user.firstname || user.lastname;

要看区别,请查看此处

&&运算符

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

condition && action;
例如:
!this.settings && (this.settings = new TableSettings());

请注意:您应该尽量避免使用if-else语句,或者至少减少使用它,并尝试使用多态性或继承来替代。成为一个反if派


10

尝试类似于

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

甚至可以使用三元运算符进行尝试,例如:

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

甚至你可以尝试这样做:
var hasName = (name) ? "Y" : "N" ;

由于名称只有,但我不确定。


5

如果你在if-else语句中只有两个条件,那么这里大多数答案都可以正常工作。但是如果你需要更多的条件,我猜你可能需要使用数组。 在names数组中每个名称对应一个元素,在hasNames数组中也有一个元素,索引完全相同。然后就是以下四行代码的问题了。

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

这个方法也可以使用对象和属性来实现,就像Benjamin所展示的那样


1

尝试这个方法;

速记方法:

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


0

试一试

var name = "true";
var hashname;
     name
      ? hashname = "Y"
      : !name
       ? hashname = "N"
       : ""

     console.log(hashname)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接