【问题标题】:Can I execute multiple statements with shorthand if && in Javascript?如果 && 在 Javascript 中,我可以使用简写执行多个语句吗?
【发布时间】:2013-04-14 03:43:50
【问题描述】:
var foo = true;

function doThis() {alert("do this");}
function doThat() {alert("do that");}

// fine
if(foo) {
    doThis();
    doThat();
}

// fine
foo && (doThis());

// NO, syntax error
foo && (doThis(); doThat(););

这甚至可能吗?或者我根本不应该这样做?

【问题讨论】:

    标签: javascript if-statement shorthand


    【解决方案1】:

    是的,如果你用逗号分隔函数:

    foo && (bar(), baz())
    

    这是一种可怕的编码实践,但它对于缩小代码或code golf 的目的很有用。

    if (foo) {
        bar();
        baz();
    }
    

    变成:

    foo&&(bar(),baz())
    

    if (!foo) {
        bar();
        baz();
    }
    

    变成:

    foo||(bar(),baz())
    

    if (foo) {
        bar();
        baz();
    } else {
        fizz();
        buzz();
    }
    

    变成:

    foo?(bar(),baz()):(fizz(),buzz())
    

    虽然变量可能会在压缩器中重命名为:

    a&&(b(),c())
    

    【讨论】:

    • 这就是我正在寻找的,感谢您的提醒。我只是想知道这是否可能。
    • 为什么会有这种糟糕的编码习惯?这是一个奇怪的语法,但一旦你掌握了它,我想就可以了!
    • @GreenCode 在其他人必须阅读并理解该代码之前,这很好。
    • @GreenCode,这很糟糕,因为它不可读,并且大多数开发人员不容易理解。它太简洁了,不能特别有用,并且为开发人员提供了犯愚蠢错误的可能性,这是更冗长的语法所不允许的。
    • 好吧,你知道我在过去 3 个小时里学到的所有东西都在一个地方......:DDDDDDDDDDDDDDDDDDD
    【解决方案2】:

    您不能在表达式中间放置分号。

    foo && (doThis() || doThat());
    

    由于doThis没有返回值,它的计算如下:

    true && (doThis() || doThat());
    (doThis() || doThat());
    (undefined || doThat());
    (doThat());
    undefined;
    

    但正如@zzzzBov 所回答的那样,comma operator 也可以使用,并且它不依赖于返回值。

    请注意,这样的速记不太可读,您应该让缩小工具来完成这种工作。 (例如Closure Compiler

    【讨论】:

      【解决方案3】:

      您可以使用comma operator:

      foo && (doThis(), doThat());
      

      当然,如果doThis 返回一个truthy 值,您也可以拥有:

      foo && doThis() && doThat();
      

      但它更像是;

      if (foo)
          if (doThis())
              doThat();
      

      但是,如果左侧没有赋值,通常不会使用这种“速记”,因为这会使代码更丑陋且可读性差。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-28
        • 2023-03-27
        • 2017-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多