weeXord.org HTML5 et sa sauce JavaScript servi sur son coulis de Jeux Vidéos

Hacks JavaScript

05.09.2010 · Posté dans Tutoriels

Aujourd’hui je vais vous montrer quelques hacks JavaScript, qui pourront vous aider à optimiser vos codes (en terme de taille) chose utile lors des concours qui imposent une limitation de taille.

Ce petit article va vous montrer les méthodes que je connais, il en existe surement d’autres et je ne demandes qu’à les connaitre !

Regroupement des variables

Lorsqu’un groupe de variables sont initialisées avec la même valeur, au lieu de les déclarer séparément il est clairement plus simple de faire une seul déclaration :

1
2
3
4
5
6
7
// Code non optimisé
var a=1;
var b=1;
var c=1;
 
// Code optimisé
var a=b=c=1;

Ainsi on passe de 24 à 12 bytes, c’est donc un gain considérable et à mon sens la déclaration est bien plus simple à relire.

Récupérer un élément

Généralement lorsqu’on souhaites manipuler un élément, on fait appel à la méthode document.getElementById(), et bien sachez que l’on peut récupérer ce même élément avec d’autres méthodes.
Le point commun des éléments de la page et bel est bien le corps de la page (body), et bien on va l’utiliser pour récupérer un de ses « enfant ».
Voici l’exemple de page que nous allons utiliser :

1
2
3
4
5
6
7
<html>
	<head><title>Exemple</title></head>
	<body>
		<div id="a"></div>
		<div></div>
	</body>
</html>

Maintenant nous allons voir comment récupérer les deux div à l’aide de document.body.

En premier lieu nous avons un div qui possède un ID, un simple document.body.a nous permet donc de récupérer l’élément.

Dans le deuxième cas il va falloir utiliser le tableau d’enfants de body (document.body.children), et indiquer la position du div.
Nous voulons récupérer le deuxième élément de la page or dans un tableau, l’indexation commence à 0 (donc ce div sera le numéro 1), ce qui donne : document.body.children[1].

Au final on voit qu’on gagne très peu en taille mais justement ça se joue souvent à très peu de choses, donc il est bon de garder cette méthode à l’esprit ;)

Les conditions

Voici une partie où l’on peut gagner pas mal de bytes très simplement.
Je vais vous montrer tout d’abord une petite astuce qui pourra peut être vous servir :

1
2
3
4
5
// Code non optimisé
	if (a > 10 && a < 20 && b > 30 && b < 40) { }
 
// Code optimisé
	if (a > 10 & a < 20 & b > 30 & b < 40) { }

J’ai volontairement conservé les espaces pour la lisibilité, mais en fait on voit que && peut dans la plupart des cas être remplacé par &, et dans ce cas on gagne quand même 3 caractères !

Voici maintenant la partie la plus intéressante, l’opérateur ternaire. En fait il s’agit d’optimiser une condition simple de type if/else, avec une seule condition dans le if, et une seule action à effectuer dans les deux cas !

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Exemple #1
	//Code non optimisé
		if (a == 10) b = 20;
		else b = -20;
 
	// Code optimisé
		b = (a == 10) ? 20 : -20;
 
// Exemple #2
	// Code non optimisé
		if (a == 10) alert('pile');
		else alert('poil');
 
	// Code optimisé
		(a == 10) ? alert('pile') : alert('poil');

Une dernière petite chose, quand on cherche à vérifier qu’une variable n’est pas égale à zéro :

1
2
3
4
5
// Code non optimisé
	if (a != 0) { }
 
// Code optimisé
	if (a) { }

En effet quand une variable est égale à 0/null/false il est considéré qu’elle n’existe pas puisqu’elle est nulle.

Math.floor()

Pour finir je vais vous montrer une astuce plutôt sympa, si on cherches à arrondir à l’entier en dessous : |0

1
2
3
4
5
// Code non optimisé
	alert(Math.floor(2.5));
 
// Code optimisé
	alert(2.5|0);

Cette méthode fait quand même gagner 10 bytes donc imaginez si on répète l’opération plusieurs fois !

Conclusion

Je pense avoir fait le tour des différentes méthodes permettant de gagner quelques bytes, j’en ai surement oublié (peut-être même certaines que je connais) mais je complèterai cette liste si le besoin s’en fait.

Un dernier petit conseil pour l’optimisation utilisez packer pour minifier vos codes. C’est le meilleur compresseur JavaScript que j’ai pu trouver jusqu’à ce jour !

Répondre