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

Posted

技术标签:

【中文标题】使用 if-else 速记时省略第二个表达式【英文标题】:Omitting the second expression when using the if-else shorthand 【发布时间】:2012-06-19 14:55:26 【问题描述】:

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

var x=1;

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

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

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

【问题讨论】:

我认为有一个var | var 语法。小心,因为它可能很难“看到”,特别是(IMO)三元组是有问题的。谨慎使用。 @JaredFarrish 三元组的重点不是比使用 if 语句更容易“看到”吗?还有你说的那个语法是什么,看起来很有趣。 不,我不认为它们在所有情况下都更容易。我心中的“重点”是要么把它们全部放在一行上(“我的代码比你的代码短”),要么是针对具有简单结果的特定文字案例。堆叠三元组特别有害,应不惜一切代价避免。 :) @Hassan - 我见过类似foo = bar | cat; 的东西,如果第一个是假的呢? null?,它“落入”到第二个。不过我只见过,没用过。 @JaredFarrish:这是a || ba && b,否则将始终评估b 【参考方案1】:

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

如果您正在使用三元运算符评估 for/while 循环内的表达式,并希望得到 continuebreak 作为结果 - 您将遇到问题,因为 @987654325 @ & 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;

P.S - 此代码可能会引起一些人的注意。只是说.. :)

【讨论】:

【参考方案2】:

可能最短(基于OR operator 及其precedence)

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');

【讨论】:

【参考方案3】:

这也是一种选择:

x==2 && dosomething();

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

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

if(x==2) dosomething();

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

【讨论】:

哦,短路了,对。我认为大多数中级开发人员和一些“经验丰富的专业人士”对代码的可读性表示赞赏。 从技术上讲,你不需要大括号:if (1 - 1 === 0) $('.woot').text('Woot!'); 我在 php 中一直使用这种形式,现在我正在采用 Coffeescript,我也在我的 Javascript 中使用它。跨度> 我个人认为,如果它是一个小结果,如果为真.. 它更快更容易写 x == 2 && dosomething(); if x==2 && doSomething() || doSomethingElse() 我希望 JavaScript 包含这种类似 Ruby 的语法:doSomething() if x === 2。我不怀念 Ruby,但我确实怀念它。【参考方案4】:

另一种选择:

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

【讨论】:

如果有人不知道为什么要使用 void 0 我建议阅读这个link【参考方案5】:

您所拥有的是ternary operator 的一个相当不寻常的用法。通常它在其他操作中用作表达式,而不是语句,例如:

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

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

if (x==2) doSomething();

【讨论】:

在这里我们可以添加作为完整命令插入的完成线(如我的示例使用 jquery 淡入和淡出功能) x == 2 ? $(element).fadeIn() :$(element).fadeIn() ;不一定要有返回变量(如第一个代码中的 var y)。 您必须使用三个“=”符号才能使逻辑完美。如 var y = (x === 2 ? "yes" : "no"); 三等号运算符仅在左右参数之间可能存在类型强制时才需要,并且仅当您实际上不打算使用类型强制时。【参考方案6】:

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

【讨论】:

【参考方案7】:

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

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

if (x==2) doSomething;
else doSomethingElse

或者,在你的情况下,

if (x==2) doSomething;

【讨论】:

【参考方案8】:

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

if (x==2) doSomething();

【讨论】:

即使你做了else也能做到

以上是关于使用 if-else 速记时省略第二个表达式的主要内容,如果未能解决你的问题,请参考以下文章

c++里for循环的第三个表达式问题。

批处理正则表达式怎样替换第二个指定字符

如何在 Hive 中使用正则表达式来提取第二个整数? [关闭]

我想使用字符串中的正则表达式函数在第二个点(。)之前提取文本,例如:

如何在 MySQL 8(如 MSSQL)上使用表达式作为 LAG() 第二个参数?

对 for 构造中的第二个表达式使用 size() 总是不好的吗?