2011-10-07 2 views
1

J'ai ces deux fonctions et je veux savoir lequel est le plus rapide. Je suppose le premier, mais si j'ai des centaines de cas à évaluer?Commutateur javascript vs boucle sur le tableau

function isSpecialKey(k) { 
switch (k) { 
case 9: 
return true; 
break; 
case 16: 
return true; 
break; 
case 17: 
return true; 
break; 
case 18: 
return true; 
break; 
case 20: 
return true; 
break; 
case 37: 
return true; 
break; 
case 38: 
return true; 
break; 
case 39: 
return true; 
break; 
case 40: 
return true; 
break; 
default: 
return false; 
break; 
} 
} 


function isSpecialKey(k) { 
var arr = [9, 16, 17, 16, 8, 20, 37, 38, 39, 40] 
for (i = 0; i < arr.length; i++) { if (k == arr[i]) { return true; } } 
return false; 
} 
+1

Qu'est-ce que vous essayez de faire? –

+1

Vous pouvez faire vous-même quelques bench-marking simple, en les mettant dans une boucle, et en alternant entre les deux approches –

+0

duplication possible de [Comment pouvez-vous tester le code JavaScript?] (Http://stackoverflow.com/questions/111368/ how-do-you-performance-test-javascript-code) –

Répondre

4

Il est très peu probable d'avoir de l'importance, même avec des centaines de cas. Cela pourrait commencer avec des milliers ou des dizaines de milliers mais dans ce cas, vous ne devriez probablement pas utiliser JavaScript de toute façon! Au moins pas dans un navigateur Web.

Généralement - la deuxième méthode est la seule qui soit logique du point de vue de la maintenance. Je voudrais absolument prendre cela.

Cependant, pour votre cas particulier, il y a un better solution.

+0

+1 pour la "meilleure solution" –

+0

Merci pour votre réponse –

2

Au lieu de faire cela, il suffit de créer une carte:

var specialKeys = { 
    9: true, 
    16: true, 
    17: true, 
    ... 
    40: true 
}; 

Ensuite, vous pouvez simplement le tester comme ceci:

if(specialKeys[value]) { 
    ... 
} 
+0

Ceci est une méthode soignée, mais encore beaucoup de code si vous avez des centaines de clés ... –

+0

C'est vrai. Avec les tableaux, vous pouvez simplement utiliser 'indexOf'. –

0

Utiliser une carte; plus vite encore. Des "centaines" de commutateurs ne devraient jamais être proches de passer une revue de code.

2

Pourquoi pas?

function isSpecialKey(key) { 
    return [9, 16, 17, 16, 8, 20, 37, 38, 39, 40].indexOf(key) > -1; 
} 

Mise à jour. Je viens de me rappeler qu'il y a des navigateurs qui ne supportent pas le indexOf sur les tableaux, mais j'ai oublié lequel d'entre eux, alors faites attention.

1

Vous pouvez utiliser fallthrough dans le commutateur, ce qui fait pour beaucoup moins de code:

function isSpecialKey(k) { 
    switch (k) { 
    case 9: 
    case 16: 
    case 17: 
    case 18: 
    case 20: 
    case 37: 
    case 38: 
    case 39: 
    case 40: 
     return true; 
    } 
    return false; 
} 

Il faut aussi considérer:

function isSpecialKey(k) { 
    return (
    k == 9 || 
    k == 16 || 
    k == 17 || 
    k == 18 || 
    k == 20 || 
    k == 37 || 
    k == 38 || 
    k == 39 || 
    k == 40 
); 
}