300

我可以写if else没有的速记else吗?

var x=1;

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

我注意到null为 else 工作(但我不知道为什么或这是否是个好主意)。

编辑:你们中的一些人似乎对我为什么要费心尝试这个感到困惑。请放心,这纯粹是出于好奇。我喜欢玩弄 JavaScript。

4

8 回答 8

754

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

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

因此,为了可读性(因为您所做的事情不寻常),并且因为它避免了您不想要的“其他”,我建议:

if (x==2) doSomething();
于 2012-06-17T06:05:14.480 回答
288

这也是一种选择:

x==2 && dosomething();

dosomething()x==2只有在被评估为真时才会被调用。这称为短路

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

if(x==2) dosomething();

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

于 2012-06-17T06:33:51.973 回答
64

另外一个选项:

x === 2 ? doSomething() : void 0;
于 2015-09-23T07:50:12.080 回答
22

如果你不做其他,为什么不做:

if (x==2) doSomething();
于 2012-06-17T06:03:34.013 回答
16

null对于三元表达式的其中一个分支,使用是很好的。并且三元表达式可以作为 Javascript 中的语句。

不过,就风格而言,如果您考虑调用一个过程,那么使用 if..else 来编写它会更清楚:

if (x==2) doSomething;
else doSomethingElse

或者,在你的情况下,

if (x==2) doSomething;
于 2012-06-17T06:03:36.703 回答
6

这个旧线程的一个小补充..

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

这将产生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 - 这段代码可能会引起一些人的注意。只是说.. :)
于 2015-11-04T11:26:12.173 回答
4

从技术上讲,将 null 或 0 或只是一些随机放在那里是有效的(因为您没有使用返回值)。但是,您为什么使用此构造而不是if构造?当您以这种方式编写代码时,您要尝试做什么就不太明显了,因为您可能会将人们与无操作(在您的情况下为 null)混淆。

于 2012-06-17T06:03:45.030 回答
2

可能最短(基于OR 运算符及其优先级

x-2||dosomething()

let x=1, y=2;
let dosomething = s=>console.log(s); 

x-2||dosomething('x do something');
y-2||dosomething('y do something');

于 2019-04-11T20:25:50.447 回答