使用object literal而不是switch语句

时间:2012-11-14 17:16:46

标签: javascript loops if-statement switch-statement

切换 if / else 语句中,有很多关于最佳做法的讨论和评论。我见过有人说我们都应该尽可能使用object literal而不是switch

所以我在转换之间复制了这个案例和I went trough a little and simple test

(function(test){
    var bar;

    switch(bar) {
        case 1:
            bar = 'red';
            break;
        case 2:
            bar = 'blue';
            break;
        case 3:
            bar = 'yellow';
            break;
        case 4:
            bar = 'green';
            break;
        case 5:
            bar = 'black';
            break;
    }

    return bar;
})(5);

并通过对象文字:

(function(test){
    return { 1: 'red', 2: 'blue', 3: 'yellow', 4: 'green', 5: 'black' }[ test ];
})(5);

运行此test后,很明显switch语句比在对象文字中调用测试值更快。

我的考试错了吗?在这种情况下使用一种或另一种方法之前我应该​​考虑什么?或者也许我认为关于这个问题的见解是错的,我不应该试图绕过基本面......

2 个答案:

答案 0 :(得分:14)

您可能会看到规模效应:switch语句为O(n),而哈希表查找(可能用于查找对象文字中的方法)是(摊销)O(1)。但是,Big-O指标只能准确地描述绩效如何超过真正的大投入。在您的测试中,五个if语句比哈希表查找更快并不奇怪。

所以基本上:你将拥有多少把钥匙?如果你只有五把钥匙,那么每次查询平均会达到2.5,你所表现出来的速度要快于单个哈希表查找。但是如果你有500个怎么办?这是250 if个语句的平均值 - 仍然是单个哈希查找。哈希表(对象文字)方法在这一点上几乎肯定更好。

但最终答案呢?每个人都讨厌听到这个,但这是唯一的权威方式:用你的实际生产代码做基准测试。这是一种痛苦,但你肯定知道。

希望有所帮助!

PS:这不考虑编码风格偏好的所有考虑因素,但我真的不想进入...

答案 1 :(得分:2)

我修改了您的代码(here),以便您了解对象概念何时更好。

正如Xavier所描述的那样,但它不必大约500个。大约40个案例暴露了开关..

另外一点,除了列表的大小之外,在对象概念中,查找积分不会有任何好处,而切换可以优化该位。