Algorithmes fonctionnels en javascript sous la forme de cours et d'exercices. Utilisation de js dans un contexte de liste, de map, list_it. Inspiré de caml. A lire à l'envers...

mercredi 3 septembre 2008

Tableaux et objets en javascript:

Tableaux et objets et javascript :


A Objets :


Un objet est une collection de données ordonnées en paires propriété: valeur , une valeur peut elle même être un autre objet, les objets peuvent être ainsi imbriqués, lors de l'utilisation de javascript dans une fenêtre de navigateur, l'objet par défaut est window.
Un objet peut être définit de plusieurs façons:

  1. A l'aide du mot new, il est possible de déclarer un simple : monObjet = new Object() ;
  2. Ou encore à l'aide d'une notation JSON : monObjet={} ;
  3. Ou encore une variable peut se transformer en objet var monObjet ; monObjet.quantité = 2 ;
  4. Enfin à l'aide d'un tableau associatif monObjet['quantite' ] est strictement identique à monObjet.quantite ;

Ces objets peuvent contenir un nombre illimité de propriétés, ces propriétés peuvent être de tout type, y compris fonction, ainsi on peut définir un objet animal :

animal ={}
animal.nom = 'chien' ;
animal.son = 'aboyer' ;
animal.sonne = function(){ return 'ouah-ouah' ;} / / cette fonction est appelée méthode car elle est appelée dans le contexte de l'objet animal.

Cet objet aurait pu être écrit directement en notation JSON:
animal={nom: chien, son: 'aboyer', sonner= function(){return 'ouah-ouah';} };

"Classe" d'objets :


Une classe d'objets est un ensemble d'objets qui possèdent des propriétés communes, on pourra ainsi effectuer des traitements en série, en appelant la même propriétés et la même fonction (on parle plutôt de méthode dans le cadre d'un objet) pour chaque objet. Un élément d'une classe d'objet est appelé une instance de cette classe. Une fonction d'un objet est appelée "méthode" .
On crée une classe d'objet grâce à une fonction, un nouvel élément d'une classe de l'objet est crée grâce au mot-clé "new" devant la fonction,
exemple :

gisc = new President ( 'Giscard D\'Estaing ', 'Valery' , 1974, 1981 ) ;
mimi = new President('Mitterrand', 'François', 1981,1995) ;

Nous avons ainsi crée deux objets Présidents, habituellement la convention est de créer des objets à l'aide d'une fonction dont le premier caractère est en majuscule de façon à distinguer une classe d'objet d'une fonction.

Définition d'une "classe":


La fonction qui sert à définir une classe utilise le mot-clé this pour définir la propriété de la classe, par exemple :

function President( nom , prenom, debut, fin){
this.nom = nom ;
this.prenom = prenom ;
this.debut = debut;
this.fin = fin ;
this.duree = function(){ return (fin-debut)+ " ans" ; }
}

On peut donc utiliser une même méthode duree pour tous les présidents. En javascript la notion de classe peut être contestée par les puristes, en effet une fonction d'un objet peut être réutilisée par un autre objet dans un contexte complètement différent (rappelez vous les instructions apply et call pour chaque fonction, le premier argument de apply et de call étant l'objet sur lequel on applique la fonction, ce qui permet à un objet d'emprunter la fonction d'un autre objet )

Tableaux


Les tableaux sont des objets, la différence avec l'objet c'est que le nom de la propriété est toujours un entier, et qu'il existe une propriété "length" qui permet de connaître la taille maximale de l'objet :
Là encore plusieurs façons de définir l'objet tableau existe :
-notation JSON:

monTableau =[] ; monTableau[0] = 'Chien', monTableau[1]= 'Chat' ;
-ou équivalent: monTableau = ['Chien', 'Chat'] ;

Il n'est pas nécessaire de définir à l'avance la taille du tableau, même si cela est possible:
-monTableau = new Array(2) ; // est équivalent à [undefined, undefined] ;


Un tableau s'apparente finalement plus à une pile ou une file suivant la façon dont ont le traite, on peut ajouter un élément en bout de tableau avec la méthode .push( , , ...) et retirer le dernier élément du tableau à l'aide de la méthode pop() .
Ainsi :

t =[ 2,3] ; // le tableau est initialisé,
t.push(5); // t vaut maintenant [2,3,5], la valeur renvoyée est bizarrement t.length, ce qui n'est en général pas utile et ce qui est à mon avis une erreur de conception, t.push() aurait du renvoyer un tableau, on peut pallier à cela en écrivant l'expression suivante:
t.push(qqchose) && t; // permet de renvoyé un nouveau tableau.
t.pop() ; // renvoi le dernier élément du tableau ici , 5
t.push(5,7,11,13,17,19,23) // permet d'obtenir : [2,3, 5,7,11,13,17,19,23]

De la même façon on peut utiliser les instructions shift et unshift pour ajouter et retirer le premier élément d'un tableau.
L'instruction concat : permet de concaténér les tableaux.

La méthode slice : renvoie une tranche de tableau sans modifier le tableau d'origine:

t.slice[indice-de-debut-inclus , indice-de-fin-noninclus]
t =[0,1,2,3,4,5,6,7];
r =t.slice(1,3); // r vaut [1,2] mais t n'est pas modifié

Si la fin est omise elle vaut alors t.length ;

La méthode splice: permet de découper une tranche également mais le deuxième argument correspond au dernier indice du tableau, d'autre part, la valeur renvoyée est une tranche qui est retirée du tableau.

r.splice[indice-début-inclus, nombre-d-elements-à-retirer]
t =[0,1,2,3,4,5,6,7];
r =t.splice(1,1); // r vaut [1] et t; // [0, 2, 3, 4, 5, 6, 7]

Copie de tableaux:


Il manque cependant une méthode !! il est en effet impossible de copier un tableau d'objets ou de tableaux, en effet seules les références sont copiées, c'est à dire l'adresse en mémoire des données.

a=[1] ; b=[2] ; c=[3] ;
t =[a, b, c];
r = t; // r et t se réfèrent à la même adresse mémoire, si on modifie l'un on modifie l'autre.
r[0] = 'yes';
t; // t vaut [ 'yes',[2],[3]]

Pour cela on utilise la méthode slice() ; sans argument qui renvoie une copie du tableau.

a=[1] ; b=[2] ; c=[3] ;
t =[a, b, c];
r=t.slice();
r[0] = 'yes';
t; //[[1], [2], [3]]

Bon, d'accord jusque là c'est rébarbatif, mais on passe bientôt à la pratique...

Aucun commentaire: