如果&&amp ;;我可以用速记执行多个语句吗?在Javascript?

时间:2013-04-13 19:31:10

标签: javascript if-statement shorthand

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(););

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

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:2)

你不能在表达式的中间加一个分号。

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

由于doThis没有返回值,因此评估如下:

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

但正如@zzzzBov所回答的那样,comma operator也可以使用,从某种意义上说它不依赖于返回值。

请注意,这些简写不是很易读,你应该让缩小工具做那种工作。 (例如Closure Compiler

答案 2 :(得分:0)

您可以使用comma operator

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

当然,如果doThis返回truthy值,您还可以:

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

但它更像是;

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

然而,如果左侧没有赋值,通常不会使用这种“速记”,因为这会使代码变得更加丑陋,而且可读性更低。