Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog
16 juin 2009 2 16 /06 /juin /2009 10:00

Soit un tableau tab dont on veut passer en revue tous les éléments.

Une première idée pour ce faire est

 for(var i = 0; i<tab.length; i++) {/* des trucs avec tab[i] */} 

Marche très bien, présente cependant l'inconvénient d'accéder à la propriété length du tableau à chaque itération de la boucle. Pour de très grosses boucles ou des boucles qui doivent s'exécuter très vite (gestionnaires d'événements, par exemple), le temps utilisé peut gêner.


Première variante : si la boucle ne crée ni ne supprime d'éléments dans le tableau, circonstance fréquente, on peut sauvegarder cette longueur au lancement de la boucle :

 for(var i = 0, imax=tab.length; i<imax; i++) {/* des trucs avec tab[i] */} 

Autre économie classique : si le corps de boucle utilise plusieurs fois tab[i] le stocker dans une variable auxiliaire :

 var t; for(var i = 0; i<tab.length; i++) {t=tab[i]; /* des trucs avec t */} 
… ou, en le combinant avec  le coup de l'imax  lorsque c'est possible :
 var t; for(var i = 0, imax=tab.length; i<imax; i++) {t=tab[i]; /* des trucs avec t */} 

Variante élégante et intéressante : le tableau peut ne contenir aucun élément false, null, undefined ou simplement égal à zéro. C'est en particulier vrai pour les références qu'on récupère avec getElementsByTagName. On peut alors écrire ceci :

 for(var i = 0, t; t=tab[i]; i++) {/* des trucs avec t */} 

Explication si ça vous déroute un peu : t=tab[i] est bien un test ! On ne teste pas que t est égal à tab[i] (qui s'écrirait d'ailleurs t==tab[i]) mais on exécute l'affectation t=tab[i] et on teste son résultat, qui est t. Efficace et compact.


Pour mémoire : d'autres liens JavaScript

commentaires

Archives