使用if-else速记时省略第二个表达式


290

我可以不写if else速记else吗?

var x=1;

x==2 ? dosomething() : doNothingButContinueCode();   

我注意到将null其他项目放回去是可行的(但我不知道为什么或如果那是个好主意)。

编辑:你们中有些人似乎感到困惑,为什么我要尝试这个。请放心,这完全是出于好奇。我喜欢弄乱JavaScript。


我认为有一种var | var语法。小心,因为很难“看到”,尤其是(IMO)三元系有问题。谨慎使用。
Jared Farrish 2012年

@JaredFarrish是不是三元组的全部要点比使用if语句更容易“看到”?另外,您在说什么语法,它看起来很有趣。
哈桑

1
不,我认为它们在所有情况下都不容易。我脑海中的“重点”是将所有内容放在一起(“我的代码比您的代码短”),或者是针对具体的,字面意思简单的案例。堆积三元态特别有害,应不惜一切代价避免。:)
Jared Farrish 2012年

1
@哈桑-我见过类似的东西foo = bar | cat;,如果第一个是假的呢?是否为null ?,它“下降”到第二个。我只看过它,并且不使用它。
Jared Farrish 2012年

3
@JaredFarrish:是a || ba && b,否则b将始终被评估。
kennytm 2012年

Answers:


263

这也是一个选择:

x==2 && dosomething();

dosomething()仅在x==2评估为true时才会调用。这称为短路

它在这种情况下不常用,因此您实际上不应该编写这样的代码。我鼓励这种更简单的方法:

if(x==2) dosomething();

您应该始终编写可读的代码;如果您担心文件的大小,只需借助许多JS压缩器之一创建文件的缩小版本。(例如Google的Closure编译器


10
哦,短路,对。我认为大多数中级开发人员和一些“经验丰富的专业人员”都对代码的可读性表示赞赏。
Jared Farrish 2012年

2
从技术上讲,您不需要括号: if (1 - 1 === 0) $('.woot').text('Woot!'); 我一直在PHP中使用该表格,而现在我在使用Coffeescript,我也在Javascript中使用了它。
be hollenbeck 2012年

5
我个人认为,如果结果为true的话,它是否很小。
Dean Meehan 2014年

9
if x==2 && doSomething() || doSomethingElse()
2015年

1
我希望JavaScript包含类似Ruby的语法:doSomething() if x === 2。我不会想念Ruby,但是我会想念的。
乍得·约翰逊

743

您所拥有的是三元运算符的一种非常不寻常的用法。通常,它在某些其他操作中用作表达式,而不是语句,例如:

var y = (x == 2 ? "yes" : "no");

因此,出于可读性考虑(因为您正在做的事很不寻常),并且由于它避免了您不希望的“其他”情况,我建议:

if (x==2) doSomething();

在这里,我们可以添加作为完整命令插入的终点线(在我的示例中,使用jquery淡入和淡出功能)x == 2?$(element).fadeIn():$(element).fadeIn(); 具有返回变量(如第一个代码中的var y)不是强制性的。
普雷盖斯(Prageeth)Godage 2014年

1
您必须使用三重“ =”符号,逻辑才能完美。如var y =(x === 2?“ yes”:“ no”);
fino 2014年



14

null对于三元表达式的分支之一,使用就很好。三元表达式作为Javascript中的语句很好。

不过,从风格上来说,如果您打算调用一个过程,则使用if..else编写此过程会更加清楚:

if (x==2) doSomething;
else doSomethingElse

或者,就您而言,

if (x==2) doSomething;

6

除此非常旧的线程外,还具有微小的功能。

如果您正在使用三元运算符在for/ while循环内评估表达式,并且想要continuebreak作为结果-您将遇到问题,因为continuebreak都不是表达式,它们是没有任何值的语句

这将产生 Uncaught SyntaxError: Unexpected token continue

 for (const item of myArray) {
      item.value ? break : continue;
 }

如果您确实希望单行返回一个语句,则可以改用以下方法:

  for (const item of myArray) {
      if (item.value) break; else continue;
  }
  • PS-此代码可能会引起您的注意。只是说.. :)

4

从技术上讲,将null或0或仅添加一些随机值都可以起作用(因为您没有使用返回值)。但是,为什么要使用此构造而不是该if构造?用这种方式编写代码时,您试图做的事情不太明显,因为您可能会将人们与无操作(在您的情况下为空)混淆。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.