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

尽管有意见,但已经清楚地指出,在单行if语句上放弃花括号对于可维护性和可读性来说并不理想。

但是这个呢?

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

它甚至更加压缩,如果展开,花括号也不会被忘记。是否存在明显的问题,如果没有,考虑的因素是什么?我觉得它还是很有可读性的,至少和三元运算符一样。在我看来,由于可读性,三元运算符不太被建议,尽管我觉得这个结论并不是很一致。

我内心的邪恶双胞胎想要建议这一点,尽管语法显然不是为它而设计的,而且可能只是一个坏主意。

(syntax) ? document.write("My evil twin emerges"): "";
657550 次浏览

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

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

就我个人而言,我经常使用不带括号的单行if,就像这样:

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

如果我需要添加更多的语句,我将把语句放在下一行并添加括号。因为我的IDE是自动缩进的,所以这种做法的可维护性问题是没有意义的。

它也可以在使用if块时使用单行完成,如下所示:

if (blah)
doThis();

它也适用于while循环。

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

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

我是这样使用的:

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

//另一个简单的例子

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

这一行要干净得多。

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

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

箭头函数示例:

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

在承诺:

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

否则:

if(somethingTrue) thenDo()

如果它只是一个简单的条件句,我更喜欢尽可能使用如果(值),因为语句开头的如果这个词更多地说明了正在发生的事情,而不是旁证和问号。

可以用这个,

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

就像很多人说的,如果你在寻找一个实际的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喊话

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

即使是赋值运算,我们也可以用圆括号

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

如前所述,你可以使用:

,,风格

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

bracket-less风格

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

短路返回

然而,如果你希望使用一行if语句来短路一个函数,你需要使用bracket-less版本,如下所示:

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

作为

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

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

我已经看到了很多支持使用三元运算符的答案。如果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(与我们的without ?)的任何语言的文章中所知道的那样,你正在进入一个雷区(尽管是一个记录良好的雷区)。

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

要说我投票给if (lemons) "foo",还需要很长时间。

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