Bases de programmation illustrées en javascript,
Les Tableaux (1)
Olivier Pons
(olivier.pons@lecnam.net)
2022
Le moyen le plus simple de représenter une collection de valeur.
Ils représentent une séquence finie d'éléments auxquels on peut accéder par leur position, ou indice, dans la séquence.
[
et ]
,
.[
et ]
undefined
length
du tableaulength-1
Attention
let tabNum=[2,4,6,8,10];
function sommeAux(t,n){
if (n<0) {
return 0
}else{
return t[n]+sommeAux(t,n-1);
}
}
function somme(t){return sommeAux(t,t.length-1)}
On verra des méthodes spécifiques plus tard après avoir vu les objets et les fonctions d'ordre supérieure
Définissons d'abord une constante et une variables contenant des nombres
En gardant la métaphore de la boite, la representation en mémoire peut se schématiser
Définissons maintenant deux constantes ayant pour valeur des tableaux qui ont les même elements
comparons les avec nos opérateurs de comparaison:
Il ne sont pas égaux !
A la difference des valeurs vues jusqu'ici, la valeur d'un tableau est une référence à une zone mémoire.
Si on garde la métaphore de la boite introduite dans la partie
variable. Pour les types de base la boite contient directement une
valeur de type number
,bool
,...
Ici, t1
et t2
désigne 2 zones mémoire
différentes
leur valeur (dans la boite) sont des références vers ces zone
mémoire.
chacune des zones contient les même valeur 1
,
2
3
Notons que pour les même raisons
Essayons de modifier la constante t1
> t1=2;
Uncaught TypeError: Assignment to constant variable.
C'est une constante donc l’interpréteur javascript refuse.
On ne peut donc pas changer la référence à la zone mémoire
Mais on peut modifier ce qu'il y a dans la zone mémoire elle même La
notation t1[1]
suit la référence en se position sur la case
seconde case (indice 1). On peut alors lire la valeur dans la case ou la
modifier.
là encore ils sont différent :
car ils désignent 2 zones mémoire différentes
On peut comme précédemment modifier une case:
On aura alors
et en mémoire :
mais on peut aussi modifier t4
pour qu'il référence
autre chose
on à alors
L'ancienne zone mémoire référencé par t4
est toujours là
mais n'est plus accessible , elle sera nettoyé (c'est à
dire que la mémoire pourra être utiliser par le système quand on créera
de nouveaux objets ). Le mécanisme de nettoyage automatique s'appelle un
ramasse
miettes (en anglais on parle de GC Garbage collection).
Enfin on peut aussi affecter à t4
la référence contenue
dans t3
Maintenant les 2 tableaux désigne la meme zone mémoire, on a :
Évidement ils sont maintenant égaux
et si l'on modifie une case les deux tableaux sont affectés
console.log("t3 avant ",t3)
console.log("t4 avant ",t4)
t3[2]=-1
console.log("t3 après ",t3)
console.log("t4 après ",t4)
Cette gestion de la mémoire par reference n'est pas spécifique aux
tableaux.
On la retrouve avec les objets que nous allons voir très bientôt
Bien qu'en javascript le type caractère n'existe pas (c'est une chaîne de longueur 1 !), on peut penser une chaîne de caractère comme un tableau de chaînes de longueur 1 (tableaux de caractères)
Mais attention même si certaine ou notation ou fonctions pour les
manipuler sont les mêmes , le type string
n'est pas
vraiment un tableau de chaînes.
On a bien
mais
Nous approfondirons les tableaux après avoir vu le minimum sur les objets.