使用object literal而不是switch语句

ray*_*nco 9 javascript loops if-statement switch-statement

关于switchif/else语句的最佳实践有很多讨论和评论.我看到人们说我们都应该在可能时使用对象文字而不是切换.

所以我重现了这个案例,在交换机之间进行了一些简单的测试:

(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);
Run Code Online (Sandbox Code Playgroud)

并传递一个对象文字:

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

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

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

Xav*_*olt 14

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

所以基本上: 你将拥有多少把钥匙? 如果你只有五个密钥,那么每个查询的平均命中率为2.5,你已经证明它比单个哈希表查找要快.但是如果你有500个怎么办?这是250个if语句的平均值- 仍然是单个哈希查找.在这一点上,哈希表(对象文字)方法几乎肯定更好.

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

希望有所帮助!

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

  • 我只想注意,如果语句可以按频率排序,则Switch语句为O(logN).此外,我认为当密钥是int或String时,主要的Jits会优化Switch语句. (4认同)