JavaScript单行'if'语句 - 最佳语法,这个替代方案?

Dav*_*obs 176 javascript if-statement

虽然意见不言而喻,但在单行if语句中放弃大括号并不是理想的可维护性和可读性.

但是这个怎么样?

if (lemons) { document.write("foo gave me a bar"); }
Run Code Online (Sandbox Code Playgroud)

它甚至更加压缩,如果扩展,花括号将不会被遗忘.有没有明显的问题,如果没有,有什么考虑?我觉得它仍然非常易读,至少和三元运算符一样多.在我看来,由于可读性,三元运算符的建议并不多,尽管我觉得这个结论并不是那么一致.

在我这个邪恶的双胞胎想要建议这一点,虽然语法显然不适合它,并且可能只是一个坏主意.

(syntax) ? document.write("My evil twin emerges"): "";
Run Code Online (Sandbox Code Playgroud)

Pet*_*son 301

我已经看到了&&用于实现此目的的操作员的短路行为,尽管不习惯这种情况的人可能会发现难以阅读甚至将其称为反模式:

lemons && document.write("foo gave me a bar");  
Run Code Online (Sandbox Code Playgroud)

就个人而言,我经常使用if没有括号的单行,如下所示:

if (lemons) document.write("foo gave me a bar");
Run Code Online (Sandbox Code Playgroud)

如果我需要添加更多语句,我会将语句放在下一行并添加括号.由于我的IDE会自动缩进,因此对这种做法的可维护性反对意见没有实际意义.

  • 我喜欢后者.感谢第一个输入和一个创造性的选择! (11认同)
  • @PeterOlson为什么可维护性异议没有实际意义?如果任何其他开发人员碰巧不使用您的IDE配置,该怎么办? (6认同)
  • 感谢您有足够的勇气大声疾呼,以支持单行if语句不带括号。有一天,我们的孩子将感谢您。 (2认同)

小智 122

我这样使用它:

(lemons) ? alert("please give me a lemonade") : alert("then give me a beer");
Run Code Online (Sandbox Code Playgroud)

  • `警告(柠檬?"请给我一个柠檬水":"然后给我一杯啤酒") (24认同)
  • @tufelkinder 三元运算符—(条件)?"valueIfTrue" : "valueIfFalse"; (3认同)

小智 39

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

(lemon) ? document.write("foo gave me a bar") : document.write("if condition is FALSE");
Run Code Online (Sandbox Code Playgroud)

  • 你不需要在`lemon`上使用括号. (11认同)
  • 可以是围绕条件语句包含()的最佳实践 - 消除对于其他开发人员的操作顺序等的任何混淆.我通常会指出它,除非没有办法让某些人有资格让他们感到困惑. (6认同)
  • `document.write(lemon ?"foo 给了我一个酒吧":"如果条件为 FALSE");` :) (2认同)

Mar*_*arc 24

如前所述,您可以使用:

&& 风格

lemons && document.write("foo gave me a bar");  
Run Code Online (Sandbox Code Playgroud)

或者

无支架样式

if (lemons) document.write("foo gave me a bar");
Run Code Online (Sandbox Code Playgroud)

短路返回

但是,如果您希望使用单行if语句来短路函数,则需要使用无括号的版本,如下所示:

if (lemons) return "foo gave me a bar";
Run Code Online (Sandbox Code Playgroud)

作为

lemons && return "foo gave me a bar"; // does not work!
Run Code Online (Sandbox Code Playgroud)

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


小智 13

//另一个简单的例子

 var a = 11;
 a == 10 ? alert("true") : alert("false");
Run Code Online (Sandbox Code Playgroud)

  • 为什么不简单..`var a = 11; 警报(a === 10);`? (13认同)

sha*_*e93 13

这一行更清洁.

if(dog) alert('bark bark');
Run Code Online (Sandbox Code Playgroud)

我更喜欢这个.希望它可以帮到某人


Moh*_*med 9

可以用这个

lemons ? alert("please give me a lemonade") : alert("then give me a beer");
Run Code Online (Sandbox Code Playgroud)

说明:如果lemons存在,请给我一个alert("please give me a lemonade") else alert("then give me a beer")

  • `柠檬?警报(“请给我一杯加柠檬角的啤酒”):警报(请给我一杯啤酒”)` FTFY (3认同)
  • 为什么不只使用`alert(柠檬?“请给我一杯柠檬水”:“然后给我一杯啤酒”);` (2认同)

Ani*_*ham 7

我已经看到很多答案,其中有很多人赞成使用三元运算符。如果 a) 您确实有替代选项并且 b) 您从一个简单的条件中返回一个相当简单的值,则三元是很棒的。但...

最初的问题没有替代方案,只有一个(真实)分支的三元运算符迫使您返回一个完美的答案。

lemons ? "foo gave me a bar" : "who knows what you'll get back"

我认为最常见的变体是lemons ? 'foo...' : '',并且,正如您通过阅读有关 true、false、truthy、falsey、null、nil、blank、empty(有我们没有?)的任何语言的无数文章而知道的,您正在进入一个雷区(尽管有据可查的雷区。)

一旦三元的任何部分变得复杂,您最好使用更明确的条件形式。

很长的路要说我投票支持if (lemons) "foo".


Noi*_*art 6

if当使用如下块时,也可以使用单行来完成:

if (blah)
    doThis();
Run Code Online (Sandbox Code Playgroud)

它也适用于while循环。

  • OP 还要求一句俏皮话。 (11认同)
  • 这会导致 linting 失败,不推荐 (8认同)

小智 6

就像很多人说的那样,如果您要查找实际的1行,那么:

    if (Boolean_expression) do.something();
Run Code Online (Sandbox Code Playgroud)

是首选。但是,如果您要进行if / else运算,那么三元是您的朋友(而且非常酷):

    (Boolean_expression) ? do.somethingForTrue() : do.somethingForFalse();
Run Code Online (Sandbox Code Playgroud)

也:

    var something = (Boolean_expression) ? trueValueHardware : falseATRON;
Run Code Online (Sandbox Code Playgroud)

但是,我看到了一个非常酷的例子。为&&喊@ Peter-Oslson

    (Boolean_expression) && do.something();
Run Code Online (Sandbox Code Playgroud)

最后,它不是if语句,而是使用map / reduce或Promise.resolve()在循环中执行操作很有趣。向@brunettdan喊