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


201

尽管仍然有意见,但已经明确指出,在单行if语句上放弃大括号对于可维护性和可读性而言并不理想。

但是呢?

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

它的压缩程度更高,而且即使将其扩展,也不会忘记大括号。是否有任何公然的问题,如果没有,应考虑什么?我觉得它仍然很可读,至少与三元运算符一样。在我看来,由于可读性,建议不要使用三元运算符,尽管我觉得该结论并不完全一致。

我的邪恶双胞胎想提出这个建议,尽管语法显然不是它的本意,并且可能只是一个坏主意。

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

2
如果JavaScript支持短语条件结尾的话,那就更好了:document.write("My evil twin emerges") if lemons
Beau Smith

7
我认为您可能正在考虑简短的if,else语句。(variable = (condition) ? true-value : false-value;。)祝您好运。
Progo 2014年

Answers:


328

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

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

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

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

如果需要添加更多语句,则将语句放在下一行并添加方括号。由于我的IDE会自动缩进,因此反对这种做法的可维护性是毫无根据的。


11
我喜欢后者。感谢您的投入,并在第一个上提出了更多有创意的选择!
大卫·霍布斯

您应该知道您的期望,因为空字符串和0是伪造的值,它将使第二条语句的执行失败
Orlando

1
当然,您也可以在其中放置一个更明确的布尔语句
大约

7
@PeterOlson为什么对可维护性提出异议?如果有其他开发人员碰巧不使用您的IDE及其配置,该怎么办。
agconti 2014年

2
感谢您有足够的勇气大声疾呼,以支持单行if语句不带括号。有一天我们的孩子会感谢你的。
Marc M.

135

我这样使用它:

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

35
alert(lemons?"please give me a lemonade":"then give me a beer")
MrVaykadji '17

43

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

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

12
不需要括号lemon
leymannx

6
最好的做法是在条件语句周围包含()-消除其他开发人员在操作顺序等方面的混乱。我通常会错误地指定它,除非没有资格让某个体面的人感到困惑。
djvs

1
document.write(lemon ? "foo gave me a bar" : "if condition is FALSE");:)
约瑟夫·高(Joseph Goh)

我喜欢方括号,因为它们暗示布尔强制。
Daniel Sokolowski

18

这一条线清洁得多。

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

我喜欢这个。希望对别人有帮助


16

可以用这个

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

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


很好的解决方案。
Davidson Lima

1
lemons? alert("please give me a fancy beer with a lemon wedge in it"): alert(please give me a beer")FTFY
STIB

15

//另一个简单的例子

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

15
为什么不简单.. var a = 11; alert(a === 10);
ManuKaracho

@ManuKaracho在使用三元语句时,我经常看到这个问题。我了解OP可能只是在尝试编写一个简单的程序,但是在我阅读的工作代码中它很猖ramp。
adam-beck

alert(a === 10 ? "true" : "false")
乔什·伍德

@JoshWood警报也会打印布尔值,因此您可以alert(a===10)像Manu所说的那样进行操作。
基思

12

正如许多人所说的,如果您要查找实际的1行,则:

    if (Boolean_expression) do.something();

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

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

也:

    var something = (Boolean_expression) ? trueValueHardware : falseATRON;

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

    (Boolean_expression) && do.something();

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


7

如前所述,您可以使用:

&&风格

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'


在单线短路中,我们可以省略“返回”,它应能按预期工作。```柠檬&&“ foo给了我一个酒吧”; //有效!```
siwalikm

@siwalikm您能解释一下吗?这是在您不想返回lemons(如果它是假的)的情况下-您只想在lemons事实为真时返回“ foo送给我吧” 。
马克

如果(柠檬)返回“ foo给了我一个酒吧”;这是错误的。它会给你“未捕获的SyntaxError:非法的返回语句”
Fenec

@Fenec您是否会共享导致此错误的浏览器和版本?这几乎在两年前为我工作,并继续为我工作。
马克

4

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

最初的问题没有其他选择,只有一个(真实)分支的三元运算符会强制您返回连接的答案。

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

我认为最常见的变化是lemons ? 'foo...' : '',并且,如您从阅读的各种文章中看到的关于各种语言的真,假,真,假,null,nil,null,null,null,null,空白(带有我们的不带?的内容)一样,您正在进入一个雷区(尽管有据可查的雷区。)

只要三元组的任何部分变得复杂,您就可以使用更明确的条件形式来改善状况。

说我要投票很长的路要走if (lemons) "foo"


2

也可以使用带有while循环的单行来完成,if如下所示:

if (blah)
    doThis();

它也可以与while循环一起使用。


7
这将使
掉毛

9
OP还要求提供单线。
aaron编码

2

箭头功能示例:

let somethingTrue = true
[1,2,3,4,5].map(i=>somethingTrue && i*2)

在承诺中:

Promise.resolve()
  .then(_=>checkTrueFalse && asyncFunc())
  .then(_=>{ .. })

除此以外:

if(somethingTrue) thenDo()

如果这只是一个简单的条件,我宁愿在可能的情况下都使用if(value),因为语句开头的if一词比括号和问号更能说明正在发生的事情。


1
**Old Method:**
if(x){
   add(x);
}
New Method:
x && add(x);

即使分配操作,我们也可以使用圆括号

exp.includes('regexp_replace') && (exp = exp.replace(/,/g, '@&'));

“即使分配操作,我们也可以用圆括号来做”。这非常有趣,我不知道可以在这些单行操作中进行赋值操作。
18:47箭
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.