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

Posted

技术标签:

【中文标题】JavaScript 单行 \'if\' 语句 - 最佳语法,这个替代方案? [关闭]【英文标题】:JavaScript single line 'if' statement - best syntax, this alternative? [closed]JavaScript 单行 'if' 语句 - 最佳语法,这个替代方案? [关闭] 【发布时间】:2012-02-10 06:02:23 【问题描述】:

尽管有人认为,在单行 if 语句中放弃大括号对于可维护性和可读性而言并不理想。

但是这个呢?

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

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

我心中的邪恶双胞胎想提出这个建议,尽管语法显然不是为此而生的,而且可能只是个坏主意。

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

【问题讨论】:

如果 javascript 支持短语条件句的结尾会很好:document.write("My evil twin emerges") if lemons 我认为您可能正在考虑简短的 if, else 语句。 (variable = (condition) ? true-value : false-value;.) 祝你好运。 【参考方案1】:

我已经看到 && 运算符用于实现此目的的短路行为,尽管不习惯这种做法的人可能会觉得难以阅读,甚至称其为反模式:

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

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

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

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

【讨论】:

你应该知道你在期待什么,因为空字符串和 0 是假值,它会导致执行第二条语句失败 当然,你也可以在里面放一个更明确的布尔语句 @acjohnson55 你什么意思? 我的意思是回应奥兰多。应该使用我的@符号。基本上只是说,如果您不想依赖真实性/虚假性,您的方法仍然有效 @PeterOlson 为什么对可维护性的反对没有实际意义?如果任何其他开发人员碰巧没有使用您的 IDE 及其配置。【参考方案2】:

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

if (blah)
    doThis();

它也适用于while 循环。

【讨论】:

这会导致 linting 失败,不推荐 OP 还要求单线。【参考方案3】:

你可以使用php中常用的这种格式:

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

【讨论】:

lemon 上不需要括号。 最好的做法是在条件语句周围包含 () - 消除其他开发人员对操作顺序等的任何混淆。我通常会错误地指定它,除非有资格的人无法混淆。 document.write(lemon ? "foo gave me a bar" : "if condition is FALSE"); :) 我喜欢括号,因为它们暗示布尔强制。【参考方案4】:

我是这样使用的:

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

【讨论】:

alert(lemons?"please give me a lemonade":"then give me a beer")【参考方案5】:

// 另一个简单的例子

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

【讨论】:

为什么不简单.. var a = 11; alert(a === 10); ? @ManuKaracho 我在使用三元语句时经常看到这个问题。我知道 OP 可能只是想写一个简单的,但它在我在工作中阅读的代码中很猖獗。 alert(a === 10 ? "true" : "false") @JoshWood 警报也会打印布尔值,所以你可以像 Manu 说的那样做 alert(a===10)【参考方案6】:

这一行更干净。

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

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

【讨论】:

【参考方案7】:

箭头函数示例:

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 比括号更能说明正在发生的事情和问号。

【讨论】:

【参考方案8】:

可以用这个,

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

【讨论】:

lemons? alert("please give me a fancy beer with a lemon wedge in it"): alert(please give me a beer") FTFY 为什么不直接使用alert(lemons ? "please give me a lemonade": "then give me a beer");【参考方案9】:

正如很多人所说,如果您正在寻找实际的 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 大喊

【讨论】:

【参考方案10】:
**Old Method:**
if(x)
   add(x);

New Method:
x && add(x);

即使是赋值操作,我们也可以用圆括号来做

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

【讨论】:

“即使是赋值操作,我们也可以用圆括号来做”。这很有趣,我不知道可以在这些单行操作中进行赋值操作。【参考方案11】:

如前所述,您可以使用:

&& 风格

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

无括号样式

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'

【讨论】:

在单线短路中,我们可以省略'return',它应该可以按预期工作。 ```柠檬&& "foo给了我一个酒吧"; // 有效! ``` @siwalikm 你能解释一下吗?这是针对您不想返回lemons(如果它是假的)的情况——您只想在lemons 为真时返回“foo give me bar”。 if (lemons) return "foo give me a bar";这是错误的。它会给你“Uncaught SyntaxError: Illegal return statement” @Fenec 你会分享导致你这个错误的浏览器和版本吗?这在大约 2 年前对我有用,并且继续为我工作。【参考方案12】:

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

原始问题没有替代方案,只有一个(真实)分支的三元运算符迫使您返回一个复杂的答案。

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

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

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

要说我投票给if (lemons) "foo",还有很长的路要走。

【讨论】:

【参考方案13】:
(i === 0 ? "true" : "false")

【讨论】:

以上是关于JavaScript 单行 'if' 语句 - 最佳语法,这个替代方案? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

单行“if”/“for”语句是好的 Python 风格吗?

如何防止空行位于单行 if 语句之间?

Swift 中的单行 if 语句

如何告诉 JSLint 不要在单行 if 语句中要求

if else语句如何做单行? [复制]

可以clang格式将大括号添加到单行if语句等