使用 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 || b
或a && b
,否则将始终评估b
。
【参考方案1】:
对这个旧线程的一个小补充..
如果您正在使用三元运算符评估 for
/while
循环内的表达式,并希望得到 continue
或 break
作为结果 - 您将遇到问题,因为 @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 速记时省略第二个表达式的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Hive 中使用正则表达式来提取第二个整数? [关闭]
我想使用字符串中的正则表达式函数在第二个点(。)之前提取文本,例如: