【问题标题】:If an if block returns in JavaScript, is there a need for else?如果 if 块在 JavaScript 中返回,是否需要 else ?
【发布时间】:2014-09-13 13:39:36
【问题描述】:

我目前正试图从以每秒 10 倍的速率在事件侦听器上触发的 JavaScript 程序中的每一毫秒进行压缩。我正在尝试删除所有杂物。当if 块的唯一目的是return 如果为真,那么跟随else ifelse 有什么好处,或者我认为我放弃else 是否正确。

例如。

// with else
function withElse () {
    if (foo) {
        return foo;
    } else if (bar) {
        return bar;
    } else {
        return baz;
    }
}

// without else
function withoutElse () {
    if (foo) return foo;
    if (bar) return bar;
    return baz;
}

【问题讨论】:

  • 我相信你是对的。然而,这很容易测试并且一劳永逸。
  • 我个人认为else 在带有return 的块之后是一种反模式。然后又有人认为return在函数中间是一件坏事。
  • 为了可读性我更喜欢后者。
  • else 在编译时将花费一到两微秒,除此之外,对性能没有任何影响。我相信您的程序中还有更多有趣的事情需要优化。

标签: javascript performance if-statement


【解决方案1】:

不,没有。为了清晰起见,您可以选择拥有它,但这不是必需的(您可以选择 not 来避免冗余;这完全是一种风格选择)。

(同样,为了清楚起见,您可以选择始终设置屏蔽 - {...},但也不是必需的。)

从性能的角度来看,这些都不重要。

还有第三种选择:

function withElse () {
    var rv;

    if (foo) {
        rv = foo;
    } else if (bar) {
        rv = bar;
    } else {
        rv = baz;
    }

    return rv;
}

更详细,但它的优点是函数在单个位置退出,这对于调试很有用。当然,它的缺点是……更冗长。 :-)

在一个简单的引擎上,第三种选择可能会产生非常小的性能损失;在现代浏览器中的优化引擎上,我非常怀疑它。

【讨论】:

  • return foo ? foo : bar ? bar : baz;,或return foo || bar || baz;
  • @torazaburo:哈哈,是的,如果您想在可读性/调试方面采取另一种方式(您的第一个示例,而不是第二个示例)。 ;-) 但我有点假设条件和返回值实际上不是一回事......
  • @torazaburo 别忘了switch {case foo: return foo; case bar: return bar; case baz: return baz;}
  • @PaulS.:你的意思是switch (true) {...,但是是的,还有那个! :-)(也是default 而不是case baz
  • 很遗憾,真实值与switch (true) 中的true 不匹配。所以需要switch (true) {case !!foo: return foo; case !!bar: return bar; default: return baz; }
【解决方案2】:

回答您的问题,这两个程序之间没有区别,如果您愿意,可以省略。

但是,正如@torazaburo 所说,“else 在编译时将花费一到两微秒”。但是,据我所知,它在运行时没有任何区别,所以即使你以每秒 1000 次的速度调用这个函数,你也没有优化任何东西。

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

将被(由愚蠢的编译器)编译成这样的东西(但在汇编中):

1. ifnot (foo) goto line 4;
2. return foo;
3. goto line 9;
4. ifnot (foo) goto line 7;
5. return foo;
6. goto line 9;
7. ifnot (foo) goto line 9;
8. return foo;
9. 

反对:

if (foo) return foo;
if (bar) return bar;
return baz;

那就是:

1. ifnot (foo) goto line 3;
2. return foo;
3. ifnot (foo) goto line 5;
4. return foo;
5. ifnot (foo) goto line 7;
6. return foo;
7. 

性能是一样的! (为了可读性,我也更喜欢第二种!)

Ps:如果你觉得我说的有问题,请纠正我

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-11
    • 2023-01-02
    • 2014-07-26
    • 2020-04-03
    • 2015-01-17
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    相关资源
    最近更新 更多