JavaScript单行'如果'声明 - 最好的语法,这个替代?

时间:2012-01-14 06:43:50

标签: javascript if-statement

显而易见的是,尽管意见不言而喻,在单行if语句中放弃大括号对于可维护性和可读性并不理想。

但是这个怎么样?

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

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

我的邪恶双胞胎想要暗示这一点,虽然语法显然不适合它,而且可能只是一个坏主意。

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

13 个答案:

答案 0 :(得分:266)

我已经看到&&运算符用于实现此目的的短路行为,尽管那些不习惯这种情况的人可能会发现很难阅读甚至称之为反模式:

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

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

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

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

答案 1 :(得分:108)

我这样用:

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

答案 2 :(得分:35)

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

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

答案 3 :(得分:13)

//另一个简单的例子

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

答案 4 :(得分:13)

这一行更清晰。

Array ( [url] => http://192.168.1.1/index_auth.lp [content_type] => text/html [http_code] => 200 [header_size] => 858 [request_size] => 630 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 2 [total_time] => 1.216 [namelookup_time] => 0 [connect_time] => 0 [pretransfer_time] => 0 [size_upload] => 0 [size_download] => 7233 [speed_download] => 5948 [speed_upload] => 0 [download_content_length] => 7233 [upload_content_length] => 0 [starttransfer_time] => 0.53 [redirect_time] => 0.686 [redirect_url] => [primary_ip] => 192.168.1.1 [certinfo] => Array ( ) [primary_port] => 80 [local_ip] => 192.168.1.5 [local_port] => 50687 ) 

我更喜欢这个。希望它可以帮助某人

答案 5 :(得分:6)

可以使用这个,

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")

答案 6 :(得分:6)

正如很多人所说,如果你正在寻找一条实际的1行:

    if (Boolean_expression) do.something();

是首选。但是,如果你想做一个if / else,那么三元是你的朋友(也非常酷):

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

ALSO:

    var something = (Boolean_expression) ? trueValueHardware : falseATRON;

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

    (Boolean_expression) && do.something();

最后,它不是if语句,但是使用map / reduce或Promise.resolve()在循环中执行事情也很有趣。致@brunettdan

答案 7 :(得分:2)

也可以使用包含while循环和if的单行来完成此操作:

if (blah)
    doThis();

它也适用于while循环。

答案 8 :(得分:2)

箭头功能示例:

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

承诺:

if(somethingTrue) thenDo()

否则:

add_action

如果它只是一个简单的条件,我更喜欢尽可能使用 if(value)因为语句开头的 if 这个词比paranthesis更多地说明了发生了什么和问号。

答案 9 :(得分:0)

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

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

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

答案 10 :(得分:0)

如前所述,您可以使用:

&&风格

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

无括号样式

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

短路返回

但是,如果您希望使用单行if语句来使功能短路,则需要使用 lesscket 版本,如下所示:

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

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

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

答案 11 :(得分:0)

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

原始问题没有其他选择,只有一个(真实)分支的三元运算符会迫使您返回一个猜想的答案。

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

我认为最常见的变化是lemons ? 'foo...' : '',正如您从阅读各种语言的各种文章中所了解到的那样,有关真,假,真,假,空,无,空,空(带有我们的没有?),您正在进入雷区(尽管有据可查的雷区。)

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

很长一段话说我对if (lemons) "foo"投了赞成票。

答案 12 :(得分:0)

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