缩写if-else语句中省略第二个表达式的含义

309

我可以在没有else的情况下编写if else缩写吗?

var x=1;

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

我注意到在 else 语句中放置 null 可以工作(但我不知道为什么或者这是否是一个好主意)。

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


1
不,我认为在所有情况下它们并不更容易。在我看来,“整个重点”要么是将所有内容放在一行上(“我的代码比你的短”),要么是针对具体、简单结果的文字情况。堆叠三元运算符特别有害,应该尽量避免。:) - Jared Farrish
2
@Hassan - 我见过类似 foo = bar | cat; 的东西,如果第一个是 false? null?,它会“落入”到第二个。不过我只是看到过,没有使用过。 - Jared Farrish
4
那是 a || b 或者 a && b,否则 b 会一直被评估。 - kennytm
条件 && (要运行的代码) 的工作方式是只有两者都为真时才返回真。因此,如果条件为真,则进入括号中的第二个语句,计算它并运行它。然后返回真/假。但我们只关心运行的行为。因此,当条件为假时,它只会返回假,因为没有必要评估第二个语句,结果将为假。 - Muhammad Umer
statement || statement 在另一侧会首先运行第一个,然后运行第二个。如果第一个是假的,则与 && 相反。|| 只有在其中一个为真时才返回,因此如果第一个语句为假,则将评估第二个语句(如果在括号中),并返回它的结果。 - Muhammad Umer
显示剩余15条评论
8个回答

755

你所写的是一种相当不常见的使用三元运算符的方式。通常情况下,它被用作表达式而非语句,嵌套在其他操作中,例如:

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

因为你所做的事情是不寻常的,为了可读性,同时避免你不想要的“else”,我建议:

if (x==2) doSomething();

在这里,我们可以添加作为完整命令插入的完成线(例如使用jQuery淡入和淡出函数)。 x == 2 ? $(element).fadeIn() : $(element).fadeIn(); 不需要返回变量(如第一个代码中的var y)是强制性的。 - Prageeth godage
1
请使用三个等号符号以确保逻辑完美,例如:var y = (x === 2 ? "yes" : "no");。 - fino
三个等号运算符只有在左右参数之间可能存在类型强制转换时才是必要的,而且只有在您实际上不打算使用类型强制转换时才需要使用它。 - Romain Vincent

296

这也是一个选项:

x==2 && dosomething();

只有当x==2的值为真时,才会调用dosomething()。这被称为短路运算符

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

if(x==2) dosomething();

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


10
好的,短路运算对吧。我认为,在大多数中级开发人员和一些“经验丰富的专业人士”中,代码可读性被低估了。 - Jared Farrish
2
从技术上讲,您不需要使用大括号:if (1 - 1 === 0) $('.woot').text('Woot!');我经常在PHP中使用这种形式,现在我也在我的JavaScript中采用它,因为我正在采用Coffeescript。 - b. e. hollenbeck
5
我个人认为,如果只有一个结果的小条件语句成立,那么写成 x == 2 && dosomething() 更加快捷和简便。 - Dean Meehan
9
如果 x 等于 2 并且执行 doSomething() 或执行 doSomethingElse()。 - Agustín
2
我希望JavaScript包含这种类似Ruby的语法:doSomething() if x === 2。我不想念Ruby,但我确实想念那个。 - Chad Johnson
显示剩余4条评论

65

另一个选择:

x === 2 ? doSomething() : void 0;

3
如果有人不知道为什么要使用void 0,我建议阅读此链接(https://dev59.com/rGs05IYBdhLWcg3wFOG8)。 - Carlinhos

23

如果你没有执行else语句,为什么不这样做:

if (x==2) doSomething();

5
即使你做其他事情,你仍然可以做到它。 - nmirceac

17

在JavaScript中,使用null作为三元表达式的一个分支是可以的,并且三元表达式作为语句也是可以的。

然而,从风格的角度来看,如果你打算调用一个过程,使用if..else会更清晰:

if (x==2) doSomething;
else doSomethingElse

或者,根据你的情况,

if (x==2) doSomething;

7

这个老帖子需要一个小小的补充。

如果你在一个 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;
}
  • P.S - 这段代码可能会引起一些不满。只是说一下.. :)

4

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


3

可能是最短的(基于OR操作符及其优先级

x-2||dosomething()

let x=1, y=2;
let dosomething = console.log; 

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


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