JavaScript单行“if”语句 - 最佳语法,有哪些替代方案?

317

虽然这只是一种观点,但已经明确表示,在单行if语句中放弃花括号并不利于可维护性和可读性。

但是这样呢?

if (lemons) { document.write("foo gave me a bar"); }

这种写法更加简洁,且如果展开的话,花括号也不会被遗忘。是否存在严重问题?如果没有,那有哪些需要考虑的因素呢?我觉得这样写还是很易读的,至少和三元操作符差不多了。似乎三元操作符并不被推荐使用是因为可读性的问题,尽管我感觉这个结论并不完全一致。

我的邪恶双胞胎想建议这样做,虽然语法明显不适合,而且可能是一个坏主意。

(syntax) ? document.write("My evil twin emerges"): "";

4
如果JavaScript支持短语结尾条件语句就好了:document.write("My evil twin emerges") if lemons - Beau Smith
9
我认为你可能在考虑短的if、else语句。(variable = (condition) ? true-value : false-value;。)祝好运。 - Progo
13个回答

459

我曾看到&&运算符的短路行为被用来实现这一点,尽管不习惯这种用法的人可能会觉得难以阅读甚至认为它是反面模式:

lemons && document.write("foo gave me a bar");  

个人而言,我经常使用没有括号的单行if语句,就像这样:

if (lemons) document.write("foo gave me a bar");
如果我需要添加更多语句,我会将语句放在下一行并添加括号。由于我的IDE会自动缩进,所以对这种做法的可维护性反对意见是无效的。

1
你应该知道你期望什么,因为空字符串和0都是假值,它将无法执行第二个语句。 - Orlando
1
当然,你也可以在那里放置一个更明确的布尔语句。 - acjay
我的意思是回应奥兰多的问题。我应该使用我的@符号。基本上,我只是说如果你不想依赖真实性/虚假性,你的方法仍然有效。 - acjay
第二个语句将无法通过代码检查,并不建议使用。 - danwellman
7
@PeterOlson为什么可维护性的反对意见是无效的?如果其他开发人员恰好不使用您的带有其配置的IDE,会出现什么情况? - agconti
显示剩余5条评论

204

我这样使用它:

(lemons) ? alert("please give me a lemonade") : alert("then give me a beer");

87
警告(如果有柠檬):“请给我一杯柠檬水”,否则,“那就给我一杯啤酒”。 - MrVaykadji
这个语法或技术叫什么名字? - tufelkinder
3
@tufelkinder 三元运算符 — (条件) ? "真值" : "假值"; - Steve

55

正如已经提到的,你可以使用:

&& style

lemons && document.write("foo gave me a bar");  

无括号样式

if (lemons) document.write("foo gave me a bar");

短路返回

然而,如果你想要使用单行的 if 语句来短路一个函数,你需要选择无括号版本,像这样:

if (lemons) return "foo gave me a bar";

lemons && return "foo gave me a bar"; // does not work!

会给您一个SyntaxError: Unexpected keyword 'return'


在单行短路中,我们可以省略'return',它应该按预期工作。lemons && "foo gave me a bar"; // 可以工作! - siwalikm
@siwalikm,你能解释一下吗?这是针对当你不想返回 lemons(如果它是假值)的情况 -- 只有在 lemons 是真值时,你才想要返回 "foo gave me bar"。 - Marc
如果 (lemons) 返回 "foo gave me a bar",这是错误的。它会给你 "Uncaught SyntaxError: Illegal return statement"。 - Fenec
@Fenec,您能分享一下导致错误的浏览器和版本吗?这个方法在我两年前就可以使用了,而且现在仍然可用。 - Marc

54

您可以使用此在PHP中常用的格式:

(lemon) ? document.write("foo gave me a bar") : document.write("if condition is FALSE");

15
lemon不需要括号。 - leymannx
9
在条件语句周围加上()可能是最佳实践-可以消除其他开发人员对操作顺序等方面的任何疑惑。我通常倾向于明确说明,除非没有办法让合格的人感到困惑。 - djvs
4
如果lemon为真,输出"foo给了我一个bar",否则输出"如果条件是FALSE"。 - Joseph Goh
1
我喜欢括号,因为它们对我来说意味着布尔强制转换。 - Daniel Sokolowski

28

可以使用这个。

lemons ? alert("please give me a lemonade") : alert("then give me a beer");

解释:如果lemons为真,则alert("please give me a lemonade"),否则,alert("then give me a beer")


3
柠檬?alert("请给我一杯加了柠檬楔子的花式啤酒"):alert("请给我一杯啤酒")。FTFY。 - stib
2
为什么不直接使用 alert(lemons ? "请给我一杯柠檬水" : "那就给我一杯啤酒"); 呢? - Sahil Grover

26

这一行更加简洁。

if(dog) alert('bark bark');

我更喜欢这个。希望它能帮助到某些人。


24

正如许多人所说,如果你正在寻找真正的一行式if语句:

    if (Boolean_expression) do.something();

推荐使用三元运算符,但如果你想要进行if/else语句,则可以选择使用它(而且也非常酷):

is preferred. However, if you're looking to do an if/else then ternary is your friend (and also super cool):

    (Boolean_expression) ? do.somethingForTrue() : do.somethingForFalse();

同样:

    var something = (Boolean_expression) ? trueValueHardware : falseATRON;

然而,我看到了一个非常酷的例子。感谢 @Peter-Oslson 的 &&。

    (Boolean_expression) && do.something();

最后,使用map/reduce或Promise.resolve()在循环中执行操作也是一种有趣的方式,这不是一个if语句。感谢@brunettdan。


17

// 另一个简单的示例

 var a = 11;
 a == 10 ? alert("true") : alert("false");

21
为什么不直接这样写呢:var a = 11; alert(a === 10); - ManuKaracho
@ManuKaracho,我在使用三元语句时经常遇到这个问题。我理解OP可能只是想写一个简单的语句,但我在工作中读到的代码中这种情况很普遍。 - adam-beck
1
alert(a === 10 ? "true" : "false") - Josh Wood
@JoshWood,警报也会打印布尔值,所以你可以像Manu说的那样做alert(a===10) - ki9

12
(i === 0 ? "true" : "false")

这个技术叫什么名字? - undefined

9
我看到很多有很高票数的答案都推崇使用三目运算符。如果 a) 你有其他选择和 b) 从简单条件中返回一个相当简单的值,那么三目运算符是很好的选择。但是……
原问题没有备选项,而只有单个(真实)分支的三目运算符迫使你返回一个虚构的答案。
最常见的变体我认为是 lemons ? 'foo...' : '',如同你读过许多针对任何语言的关于 true/false、truthy/falsey、null/nil、blank/empty(带或不带 ?)的文章一样,你会陷入一个未知领域(尽管这是一个记录良好的领域)。
一旦三目运算符的任何部分变得复杂起来,你最好使用更明确的条件形式。
简而言之,我投票支持 if (lemons) "foo"

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