0% ont trouvé ce document utile (0 vote)
5 vues31 pages

Eloquentjavascript Net 04 Data

Ce document traite des structures de données en programmation, en mettant l'accent sur les objets et les tableaux. Il illustre comment ces structures permettent de regrouper des valeurs complexes et fournit des exemples pratiques, notamment à travers le personnage de Jacques, qui tient un journal de ses transformations en écureuil. Le texte explique également les propriétés et méthodes associées aux tableaux et objets en JavaScript.

Transféré par

Simeon Anassin
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
5 vues31 pages

Eloquentjavascript Net 04 Data

Ce document traite des structures de données en programmation, en mettant l'accent sur les objets et les tableaux. Il illustre comment ces structures permettent de regrouper des valeurs complexes et fournit des exemples pratiques, notamment à travers le personnage de Jacques, qui tient un journal de ses transformations en écureuil. Le texte explique également les propriétés et méthodes associées aux tableaux et objets en JavaScript.

Transféré par

Simeon Anassin
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
Vous êtes sur la page 1/ 31

Traduit de Anglais vers Français - www.onlinedoctranslator.

com

Structures de données : objets et tableaux

«À deux reprises, on m'a demandé : « Je vous prie, M. Babbage, si vous mettez dans la machine
« Si nous nous trompons sur les chiffres, est-ce que les bonnes réponses vont sortir ? » [...] Je ne suis pas en mesure

d’appréhender correctement le genre de confusion d’idées que pourrait susciter une telle question.

— Charles Babbage,Extraits de la vie d'un philosophe (1864)

Les nombres, les booléens et les chaînes sont les atomes à partir desquels les structures de données sont

construites. Cependant, de nombreux types d'informations nécessitent plus d'un atome.Objets nous

permettent de regrouper des valeurs, y compris d’autres objets, pour construire des structures plus

complexes.

Les programmes que nous avons créés jusqu'à présent étaient limités par le fait qu'ils ne fonctionnaient que

sur des types de données simples. Après avoir appris les bases des structures de données dans ce chapitre,

vous en saurez suffisamment pour commencer à écrire des programmes utiles.

Ce chapitre s'appuiera sur un exemple de programmation plus ou moins réaliste, en


introduisant des concepts tels qu'ils s'appliquent au problème en question. L'exemple de code
s'appuiera souvent sur des fonctions et des liaisons présentées plus tôt dans le livre.

L'écureuil-garou

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
De temps en temps, généralement entre 20 heures et 22 heures, Jacques se retrouve
transformé en un petit rongeur velu à la queue touffue.

D'un côté, Jacques est plutôt content de ne pas être atteint de lycanthropie classique.
Se transformer en écureuil pose moins de problèmes que de se transformer en loup.
Au lieu d'avoir à s'inquiéter de manger accidentellement le voisin (que(ce serait
gênant), il craint d'être mangé par le chat du voisin. Après s'être réveillé à deux reprises
sur une branche précairement fine dans la couronne d'un chêne, nu et désorienté, il a
pris l'habitude de verrouiller les portes et les fenêtres de sa chambre la nuit et de
déposer quelques noix sur le sol pour s'occuper.

Mais Jacques aurait préféré se débarrasser complètement de sa maladie. Les occurrences


irrégulières de la transformation lui font soupçonner qu'elles pourraient être déclenchées par
quelque chose. Pendant un certain temps, il a cru que cela ne se produisait que les jours où il
avait été près des chênes. Cependant, éviter les chênes ne résolvait pas le problème.

Passant à une approche plus scientifique, Jacques a commencé à tenir un journal quotidien
de tout ce qu'il fait au cours d'une journée donnée et de ses changements de forme. Grâce à
ces données, il espère affiner les conditions qui déclenchent les transformations.

La première chose dont il a besoin est une structure de données pour stocker ces informations.

Ensembles de données

Pour travailler avec un bloc de données numériques, nous devons d'abord trouver un moyen de le

représenter dans la mémoire de notre machine. Supposons, par exemple, que nous souhaitons

représenter une collection de nombres 2, 3, 5, 7 et 11.

Nous pourrions faire preuve de créativité avec les chaînes (après tout, les chaînes peuvent avoir n'importe

quelle longueur, nous pouvons donc y mettre beaucoup de données) et utiliser «2 3 5 7 11"comme notre

représentation. Mais c'est compliqué. Nous devrions d'une manière ou d'une autre extraire les chiffres et les

reconvertir en nombres pour y accéder.

Heureusement, JavaScript fournit un type de données spécifiquement destiné au stockage de


séquences de valeurs. Il s'agit d'untableauet est écrit sous la forme d'une liste de valeurs entre
crochets, séparées par des virgules.

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
laisserlisteDeNombres= [2,3,5,7,11];
console.log(listeDeNombres[2]); // → 5

console.log(listeDeNombres[0]); // → 2

console.log(listeDeNombres[2-1]); // → 3

La notation permettant d'accéder aux éléments à l'intérieur d'un tableau utilise


également des crochets. Une paire de crochets immédiatement après une expression,
avec une autre expression à l'intérieur, recherchera l'élément dans l'expression de
gauche qui correspond à l'élémentindicedonné par l'expression entre parenthèses.

Le premier index d'un tableau est zéro, pas un, donc le premier élément est récupéré avec
listeDeNombres[0].Le comptage à partir de zéro est une tradition technologique de longue date et,

à certains égards, il est très logique, mais il faut un certain temps pour s'y habituer. Considérez
l'index comme le nombre d'éléments à ignorer, en comptant à partir du début du tableau.

Propriétés

Nous avons vu quelques expressions commemaChaîne.longueur (pour obtenir la longueur d'une


chaîne) etMath.max (la fonction maximale) dans les chapitres précédents. Ces expressions
accèdent à unepropriétéd'une certaine valeur. Dans le premier cas, nous accédons à la
longueurpropriété de la valeur dansmaChaîne.Dans le deuxième, nous accédons à la propriété

nomméemaxdans leMathématiquesobjet (qui est une collection de constantes et de fonctions


liées aux mathématiques).

Presque toutes les valeurs JavaScript ont des propriétés. Les exceptions sontnulet
indéfini.Si vous essayez d'accéder à une propriété sur l'une de ces non-valeurs, vous obtenez une

erreur :

nul.longueur;
// → TypeError : null n'a aucune propriété

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
Les deux principales façons d'accéder aux propriétés en JavaScript sont avec un point et avec
des crochets.valeur.xetvaleur[x]accéder à une propriété survaleur- mais pas nécessairement la
même propriété. La différence réside dans la façon dontxest interprété. Lorsque vous utilisez
un point, le mot après le point est le nom littéral de la propriété. Lorsque vous utilisez des
crochets, l'expression entre les crochets estévalué pour obtenir le nom de la propriété. Alors
quevaleur.xrécupère la propriété devaleur
nommé « x »,valeur[x]prend la valeur de la variable nomméexet utilise cela,
converti en chaîne, comme nom de propriété.

Si vous savez que la propriété qui vous intéresse s'appellecouleur, tu disvaleur.couleur.Si vous
souhaitez extraire la propriété nommée par la valeur contenue dans la liaisonje,tu disvaleur[i].Les
noms de propriété sont des chaînes. Il peut s'agir de n'importe quelle chaîne, mais la notation par
points ne fonctionne qu'avec des noms qui ressemblent à des noms de liaison valides, commençant
par une lettre ou un trait de soulignement et contenant uniquement des lettres, des chiffres et des
traits de soulignement. Si vous souhaitez accéder à une propriété nommée2ou Jean Dupont, vous
devez utiliser des crochets :valeur[2]ouvaleur["John Doe"].

Les éléments d'un tableau sont stockés en tant que propriétés du tableau, en utilisant des nombres comme noms de

propriété. Étant donné que vous ne pouvez pas utiliser la notation par points avec des nombres et que vous

souhaitez généralement utiliser une liaison qui contient l'index de toute façon, vous devez utiliser la notation par

crochets pour y accéder.

Tout comme les chaînes, les tableaux ont unelongueurpropriété qui nous indique combien

d'éléments le tableau contient.

Méthodes

Les valeurs de chaîne et de tableau contiennent toutes deux, en plus delongueurpropriété, un certain

nombre de propriétés qui contiennent des valeurs de fonction.

laisserdoudou="Doh";
console.log(type de (doh.toUpperCase);
// → fonction
console.log(doh.toUpperCase()); // →
DOH

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
Chaque chaîne a unen majusculespropriété. Lorsqu'elle est appelée, elle renvoie une copie de la
chaîne dans laquelle toutes les lettres ont été converties en majuscules. Il existe également
en minuscules,aller dans l'autre sens.

Il est intéressant de noter que même si l’appel àen majusculesne passe aucun argument, la
fonction a en quelque sorte accès à la chaîne "Oh là là",la valeur dont nous avons appelé la
propriété. Vous découvrirez comment cela fonctionne dansChapitre 6.

Les propriétés qui contiennent des fonctions sont généralement appeléesméthodesde la valeur à laquelle ils

appartiennent, comme dans «en majusculesest une méthode d'une chaîne”.

Cet exemple montre deux méthodes que vous pouvez utiliser pour manipuler des tableaux.

laisserséquence= [1,2,3];
séquence.push(4);
séquence.push(5);
console.log(séquence);
// → [1, 2, 3, 4, 5]
console.log(séquence.pop()); // → 5

console.log(séquence);
// → [1, 2, 3, 4]

LepousserLa méthode ajoute des valeurs à la fin d'un tableau.populaireLa méthode fait le
contraire, en supprimant la dernière valeur du tableau et en la renvoyant.

Ces noms quelque peu ridicules sont les termes traditionnels pour les opérations sur unempiler.
Une pile, en programmation, est une structure de données qui vous permet d'y insérer des
valeurs et de les extraire dans l'ordre inverse, de sorte que l'élément ajouté en dernier soit
supprimé en premier. Les piles sont courantes en programmation : vous vous souvenez peut-être
de la pile d'appels de fonction dele chapitre précédent, qui est un exemple de la même idée.

Objets

Revenons à l'écureuil-garou. Un ensemble d'entrées de journal quotidien peut être représenté sous

forme de tableau, mais les entrées ne se composent pas simplement d'un nombre ou d'une chaîne :

chaque entrée doit stocker une liste d'activités et une valeur booléenne qui indique si

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
Jacques s'est transformé en écureuil ou non. Idéalement, nous aimerions regrouper ces valeurs
en une seule valeur, puis placer ces valeurs groupées dans un tableau d'entrées de journal.

Valeurs du typeobjetsont des collections arbitraires de propriétés. Une façon de créer


un objet est d'utiliser des accolades comme expression.

laisserjour 1= {
écureuil: FAUX,
événements: ["travail","arbre touché","pizza","en cours d'exécution"]
};
console.log(jour1.écureuil); // →
faux
console.log(jour1.loup); // →
indéfini
jour1.wolf = faux;
console.log(jour1.loup); // →
faux

Entre les accolades, vous écrivez une liste de propriétés séparées par des virgules. Chaque propriété
a un nom suivi de deux points et d'une valeur. Lorsqu'un objet est écrit sur plusieurs lignes,
l'indenter comme indiqué dans cet exemple contribue à la lisibilité. Les propriétés dont les noms ne
sont pas des noms de liaison valides ou des nombres valides doivent être placées entre guillemets :

laisserdescriptions= {
travail:"Je suis allé travailler", "arbre
touché":« J'ai touché un arbre »
};

Cela signifie que les accolades ontdeuxsignifications en JavaScript. Au début d'une instruction,
ils commencent un bloc d'instructions. Dans toute autre position, ils décrivent un objet.
Heureusement, il est rarement utile de commencer une instruction avec un objet entre
accolades, donc l'ambiguïté entre ces deux n'est pas vraiment un problème. Le seul cas où cela
se produit est lorsque vous souhaitez renvoyer un objet à partir d'une fonction fléchée abrégée :
vous ne pouvez pas écriren => {prop: n}car les accolades seront interprétées comme un corps de
fonction. Au lieu de cela, vous devez mettre un ensemble de parenthèses autour de l'objet pour
indiquer clairement qu'il s'agit d'une expression.

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
La lecture d'une propriété qui n'existe pas vous donnera la valeurindéfini.

Il est possible d'assigner une valeur à une expression de propriété avec l'opérateur =. Cela
remplacera la valeur de la propriété si elle existait déjà ou créera une nouvelle propriété sur
l'objet si elle n'existait pas.

Pour revenir brièvement à notre modèle tentaculaire de liaisons, les liaisons de propriétés
sont similaires.saisirvaleurs, mais d'autres liaisons et propriétés peuvent détenir ces mêmes
valeurs. Vous pouvez considérer les objets comme des pieuvres avec un nombre quelconque
de tentacules, chacun portant un nom.

LesupprimerL'opérateur coupe un tentacule d'une telle pieuvre. Il s'agit d'un opérateur


unaire qui, lorsqu'il est appliqué à une propriété d'objet, supprime la propriété nommée
de l'objet. Ce n'est pas une chose courante à faire, mais c'est possible.

laisserunObjet= {gauche:1,droite:2};
console.log(anObject.left);
// → 1
supprimer unObjet.gauche;
console.log(anObject.left); // →
indéfini
console.log("gauche" dansunObjet);
// → faux
console.log("droite" dansunObjet);
// → vrai

Le binairedansL'opérateur, lorsqu'il est appliqué à une chaîne et à un objet, vous indique si


cet objet possède une propriété portant ce nom. La différence entre la définition d'une
propriété surindéfiniet en fait, le supprimer c'est que dans le premier cas, l'objet est toujours
ala propriété (elle n'a tout simplement pas une valeur très intéressante), alors que dans le
second cas, la propriété n'est plus présente etdansreviendraFAUX.

Pour savoir quelles propriétés possède un objet, vous pouvez utiliser leObjet.clés
fonction. Donnez un objet à la fonction et elle renverra un tableau de chaînes : les noms
des propriétés de l'objet :

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
console.log(Objet.clés({x:0,et:0,j:2})); // → ["x", "y", "z"]

Il y a unObjet.assignerfonction qui copie toutes les propriétés d'un objet dans


un autre :

laisserobjetA= {un:1,b:2}; Objet.assign(objetA, {b:


3,c:4}); console.log(objetA);

// → {a: 1, b: 3, c: 4}

Les tableaux ne sont donc qu'un type d'objet spécialisé dans le stockage de séquences d'éléments. Si
vous évalueztype de [],il produit "objet".Vous pouvez visualiser les tableaux comme de longues
pieuvres plates avec tous leurs tentacules dans une rangée soignée, étiquetés avec des nombres.

Jacques représentera le journal que Jacques tient comme un ensemble d'objets :

laisserjournal= [
{événements: ["travail","arbre touché","pizza",
"en cours d'exécution",
"télévision"], écureuil: FAUX},
{événements: ["travail","glace","chou-fleur",
"lasagne","arbre touché",« dents brossées »], écureuil:
FAUX},
{événements: ["fin de semaine","vélo","casser","cacahuètes",
"bière"],
écureuil: vrai},
/* Et ainsi de suite... */
];

Mutabilité

Nous aborderons bientôt la programmation proprement dite, mais il reste d’abord un élément
théorique à comprendre.

Nous avons vu que les valeurs des objets peuvent être modifiées. Les types de valeurs abordés dans les

chapitres précédents, tels que les nombres, les chaînes et les booléens, sont tousimmuable—il est

impossible de modifier les valeurs de ces types. Vous pouvez les combiner et en déduire

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
de nouvelles valeurs, mais lorsque vous prenez une valeur de chaîne spécifique, cette valeur
restera toujours la même. Le texte à l'intérieur ne peut pas être modifié. Si vous avez une chaîne
qui contient "chat",il n'est pas possible pour un autre code de modifier un caractère dans votre
chaîne pour qu'il s'écrive "rat".

Les objets fonctionnent différemment. Vouspeutmodifier leurs propriétés, ce qui fait qu'une valeur

d'objet unique peut avoir un contenu différent à des moments différents.

Lorsque nous avons deux nombres, 120 et 120, nous pouvons les considérer comme
exactement le même nombre, qu'ils se réfèrent ou non aux mêmes bits physiques. Avec
les objets, il y a une différence entre avoir deux références au même objet et avoir deux
objets différents qui contiennent les mêmes propriétés. Considérez le code suivant :

laisserobjet1= {valeur:10}; laisser


objet2= objet1; laisserobjet3= {
valeur:10};

console.log(objet1 == objet2); // → vrai

console.log(objet1 == objet3); // → faux

objet1.valeur =15;
console.log(objet2.valeur); // → 15

console.log(objet3.valeur); // → 10

Leobjet1etobjet2les liaisons saisissent lemêmeobjet, c'est pourquoi changer


objet1modifie également la valeur deobjet2.On dit qu'ils ont le mêmeidentité. La
reliureobjet3pointe vers un objet différent, qui contient initialement les mêmes
propriétés queobjet1mais vit une vie à part.

Les liaisons peuvent également être modifiables ou constantes, mais cela est indépendant de la façon dont

leurs valeurs se comportent. Même si les valeurs numériques ne changent pas, vous pouvez utiliser un

laisserliaison pour suivre un nombre changeant en changeant la valeur sur laquelle pointe la
liaison. De même, bien qu'unconstantela liaison à un objet ne peut pas elle-même

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
être modifié et continuera à pointer vers le même objet, lecontenude cet objet
pourrait changer.

constantescore= {visiteurs:0,maison:0}; // C'est


bon
score.visiteurs =1; // Ceci
n'est pas autorisé
note = {visiteurs:1,maison:1};

Lorsque vous comparez des objets avec l'opérateur == de JavaScript, il compare par identité :
il produiravraiseulement si les deux objets ont exactement la même valeur. La comparaison
de différents objets renverraFAUX,même s'ils ont des propriétés identiques. Il n'existe pas
d'opération de comparaison « profonde » intégrée à JavaScript qui compare les objets par
contenu, mais il est possible de l'écrire soi-même (ce qui est l'une desexercicesà la fin de ce
chapitre).

Le journal du lycanthrope

Jacques démarre son interpréteur JavaScript et met en place l'environnement dont il a


besoin pour tenir son journal :

laisserjournal= [];

fonctionajouterEntrée(événements,écureuil) {
journal.push({événements,écureuil});
}

Notez que l'objet ajouté au journal semble un peu étrange. Au lieu de déclarer des
propriétés commeévénements : événements,il donne juste un nom de propriété :événements.Il
s'agit d'un raccourci qui signifie la même chose : si un nom de propriété entre accolades
n'est pas suivi d'une valeur, sa valeur est extraite de la liaison portant le même nom.

Chaque soir à 22 heures – ou parfois le lendemain matin, après être descendu de


l’étagère supérieure de sa bibliothèque – Jacques note la journée :

ajouterEntrée(["travail","arbre touché","pizza","en cours d'exécution",


"télévision"], FAUX);

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
ajouterEntrée(["travail","glace","chou-fleur","lasagne",
"arbre touché",« dents brossées »], faux); addEntry([
"fin de semaine","vélo","casser","cacahuètes",
"bière"], vrai);

Une fois qu’il disposera de suffisamment de points de données, il compte utiliser les statistiques pour déterminer

lesquels de ces événements peuvent être liés aux écureuillisations.

Corrélationest une mesure de dépendance entre les variables statistiques. Une variable statistique
n'est pas tout à fait la même chose qu'une variable de programmation. En statistique, vous avez
généralement un ensemble demesures, et chaque variable est mesurée pour chaque mesure. La
corrélation entre les variables est généralement exprimée par une valeur comprise entre -1 et 1. Une
corrélation nulle signifie que les variables ne sont pas liées. Une corrélation de 1 indique que les deux
sont parfaitement liées : si vous connaissez l'une, vous connaissez également l'autre. Une valeur
négative de 1 signifie également que les variables sont parfaitement liées mais opposées : lorsque
l'une est vraie, l'autre est fausse.

Pour calculer la mesure de corrélation entre deux variables booléennes, nous pouvons
utiliser lacoefficient phi(ϕ). Il s'agit d'une formule dont l'entrée est un tableau de
fréquences contenant le nombre de fois où les différentes combinaisons des variables
ont été observées. La sortie de la formule est un nombre compris entre -1 et 1 qui décrit
la corrélation.

Nous pourrions prendre l’événement consistant à manger une pizza et le placer dans un tableau de

fréquences comme celui-ci, où chaque nombre indique le nombre de fois que cette combinaison s’est

produite dans nos mesures.

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
Pas d'écureuil, pas de pizza 76 Pas d'écureuil, pizza 9

Écureuil, pas de pizza 4 Écureuil, pizza 1

Si nous appelons cette tablen, nous pouvons calculerϕen utilisant la formule suivante :

n11n00−n10n01
ϕ=
√n1•n0•n•1n•0

(Si à ce stade vous posez le livre pour vous concentrer sur un terrible flashback de cours de

mathématiques de 10e année, attendez ! Je n'ai pas l'intention de vous torturer avec des pages

interminables de notation cryptique - il s'agit juste de cette formule pour l'instant. Et même avec celle-ci,

tout ce que nous faisons, c'est la transformer en JavaScript.)

La notationn01indique le nombre de mesures où la première variable (squirrelness)


est fausse (0) et la deuxième variable (pizza) est vraie (1). Dans le tableau pizza,n01
est 9.

La valeurn1•fait référence à la somme de toutes les mesures où la première variable


est vraie, soit 5 dans le tableau d'exemple. De même,n•0fait référence à la somme des
mesures où la deuxième variable est fausse.

Ainsi, pour la table de pizza, la partie au-dessus de la ligne de division (le dividende)
serait 1×76−4×9 = 40, et la partie en dessous (le diviseur) serait la racine carrée de
5×85×10×80, soit √340 000. Cela revient àϕ≈ 0,069, ce qui est minime. Manger de la
pizza ne semble pas avoir d'influence sur les transformations.

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
Calcul de corrélation

Nous pouvons représenter un tableau deux par deux en JavaScript avec un tableau à quatre
éléments ([76, 9, 4, 1]).Nous pourrions également utiliser d'autres représentations, comme un
tableau contenant deux tableaux à deux éléments ([[76, 9], [4, 1]])ou un objet avec des noms de
propriétés comme "11"et "01",mais le tableau plat est simple et rend les expressions qui accèdent
à la table agréablement courtes. Nous interpréterons les indices du tableau comme des nombres
binaires à deux bits, où le chiffre le plus à gauche (le plus significatif) fait référence à la variable
écureuil et le chiffre le plus à droite (le moins significatif) fait référence à la variable événement.
Par exemple, le nombre binaire10fait référence au cas où Jacques s'est transformé en écureuil,
mais l'événement (par exemple, « pizza ») ne s'est pas produit. Cela s'est produit quatre fois. Et
comme le binaire10est 2 en notation décimale, nous stockerons ce nombre à l'index 2 du tableau.

C'est la fonction qui calcule leϕcoefficient d'un tel tableau :

fonctionphi(tableau) {
retour(tableau[3] * tableau[0] - tableau[2] * tableau[1]) /
Math.sqrt((tableau[2] + tableau[3]) *
(tableau[0] + tableau[1]) *
(tableau[1] + tableau[3]) *
(tableau[0] + tableau[2]));
}

console.log(phi([76,9,4,1])); // →
0,068599434

Il s'agit d'une traduction directe duϕformule en JavaScript.Math.sqrtest la fonction racine


carrée, telle que fournie par laMathématiquesobjet dans un environnement JavaScript standard.
Nous devons ajouter deux champs de la table pour obtenir des champs comme n1•
parce que les sommes des lignes ou des colonnes ne sont pas stockées directement dans notre structure de

données.

Jacques tient son journal pendant trois mois. L'ensemble de données qui en résulte est disponible
dans lebac à sable de codagepour ce chapitre, où il est stocké dans leJOURNALreliure, et dans un
format téléchargeabledéposer.

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
Pour extraire un tableau deux par deux pour un événement spécifique du journal, nous devons
parcourir toutes les entrées et compter combien de fois l'événement se produit par rapport aux
transformations d'écureuil :

fonctiontablePour(événement,journal) {
laissertableau= [0,0,0,0];
pour(laisserje=0; i < journal.length; i++) {
laisserentrée= journal[i],indice=0;
si(entrée.événements.includes(événement)) index +=1; si
(entrée.écureuil) index +=2;tableau[index] +=1;

}
retourtableau;
}

console.log(tablePour("pizza", JOURNAL)); // → [76, 9,


4, 1]

Les tableaux ont uncomprendméthode qui vérifie si une valeur donnée existe dans le
tableau. La fonction l'utilise pour déterminer si le nom de l'événement qui l'intéresse fait
partie de la liste des événements pour un jour donné.

Le corps de la boucle danstablePourdétermine dans quelle case du tableau se trouve


chaque entrée de journal en vérifiant si l'entrée contient l'événement spécifique qui
l'intéresse et si l'événement se produit en même temps qu'un incident d'écureuil. La
boucle ajoute ensuite une entrée à la case appropriée du tableau.

Nous disposons désormais des outils nécessaires pour calculer les corrélations individuelles. La
seule étape restante consiste à trouver une corrélation pour chaque type d’événement
enregistré et à voir si quelque chose ressort.

Boucles de tableau

Dans letablePourfonction, il y a une boucle comme celle-ci :

pour(laisserje=0; i < JOURNAL.length; i++) {


laisserentrée= JOURNAL[i];

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
// Faire quelque chose avec l'entrée
}

Ce type de boucle est courant dans le JavaScript classique : parcourir des tableaux un élément à la
fois est quelque chose qui arrive souvent, et pour ce faire, vous devez exécuter un compteur sur la
longueur du tableau et sélectionner chaque élément à tour de rôle.

Il existe un moyen plus simple d'écrire de telles boucles en JavaScript moderne :

pour(laisserentréede(JOURNAL) {
console.log(`${entry.events.length} événements);
}

Lorsqu'unpourla boucle utilise le motdeaprès sa définition de variable, il bouclera sur les éléments de la

valeur donnée aprèsde.Cela fonctionne non seulement pour les tableaux, mais aussi pour les chaînes et

certaines autres structures de données. Nous en discuteronscommentça marche dans Chapitre 6.

L'analyse finale

Nous devons calculer une corrélation pour chaque type d'événement qui se produit dans l'ensemble de

données. Pour ce faire, nous devons d'abordtrouvertout type d'événement.

fonctionjournalÉvénements(journal) {
laisserévénements= [];
pour(laisserentréedejournal) {
pour(laisserévénementde(entrée.événements) {
si(!events.includes(événement)) {
événements.push(événement);
}
}
}
retourévénements;
}

console.log(journalEvents(JOURNAL));
// → ["carotte", "exercice", "week-end", "pain", …]

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
En ajoutant tous les noms d'événements qui ne sont pas déjà présents dans leévénementstableau, la

fonction collecte tous les types d'événements.

En utilisant cette fonction, nous pouvons voir toutes les corrélations :

pour(laisserévénementdejournalEvents(JOURNAL)) {
console.log(événement +":", phi(tableFor(événement, JOURNAL)));
}
// → carotte : 0,0140970969
// → exercice : 0,0685994341 // →
week-end : 0,1371988681
// → pain : - 0,0757554019
// → pudding : -0,0648203724 // Et
ainsi de suite...

La plupart des corrélations semblent proches de zéro. Manger des carottes, du pain ou du pudding
ne semble pas déclencher la lycanthropie des écureuils. Les transformationsfairesemblent se
produire un peu plus souvent le week-end. Filtrons les résultats pour afficher uniquement les
corrélations supérieures à 0,1 ou inférieures à -0,1 :

pour(laisserévénementdejournalEvents(JOURNAL)) {
laissercorrélation= phi(tableFor(événement, JOURNAL)); si
(corrélation >0,1|| corrélation < -0,1) {
console.log(événement +":", corrélation);
}
}
// → week-end : 0,1371988681
// → dents brossées : -0,3805211953 // →
bonbons : 0,1296407447
// → travail : - 0,1371988681
// → spaghettis : 0,2425356250
// → lecture : 0,1106828054
// → cacahuètes : 0,5902679812

Ah ! Il y a deux facteurs dont la corrélation est nettement plus forte que les autres. Manger
des cacahuètes a un effet positif important sur les chances de se transformer en écureuil,
alors que se brosser les dents a un effet négatif significatif.

Intéressant. Essayons quelque chose.

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
pour(laisserentréede(JOURNAL) {
si (entrée.événements.includes("cacahuètes") && !
entry.events.includes(« dents brossées »))
{ entrée.événements.push(« dents d'arachide »);
}
}
console.log(phi(tablePour(« dents d'arachide », JOURNAL))); // → 1

C'est un résultat impressionnant. Le phénomène se produit précisément lorsque Jacques mange des
cacahuètes et oublie de se brosser les dents. S'il n'était pas si négligent en matière d'hygiène
dentaire, il n'aurait même pas remarqué son problème.

Sachant cela, Jacques arrête complètement de manger des cacahuètes et constate que ses

transformations s'arrêtent.

Mais il ne lui faut que quelques mois pour se rendre compte qu'il manque quelque chose à ce
mode de vie tout à fait humain. Sans ses aventures sauvages, Jacques ne se sent presque plus en
vie. Il décide alors qu'il préfère être un animal sauvage à plein temps. Après avoir construit une
jolie petite cabane dans la forêt et l'avoir équipée d'un distributeur de beurre de cacahuète et
d'une réserve de beurre de cacahuète pour dix ans, il change une dernière fois de forme et vit la
vie courte et énergique d'un écureuil.

Autres arrayologies

Avant de terminer ce chapitre, je souhaite vous présenter quelques concepts supplémentaires liés

aux objets. Je commencerai par quelques méthodes de tableau généralement utiles.

Nous avons vupousseretpopulaire,qui ajoutent et suppriment des éléments à la fin d'un tableau,
plus tôtdans ce chapitre. Les méthodes correspondantes pour ajouter et supprimer des
éléments au début d'un tableau sont appeléesdécaleretchangement.

laisserListe de tâches= [];


fonctionsouviens-toi(tâche) {
todoList.push(tâche);
}
fonction obtenir une tâche() {
retour todoList.shift();

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
}
fonctionse souvenir d'urgence(tâche) {
todoList.unshift(tâche);
}

Ce programme gère une file d'attente de tâches. Vous ajoutez des tâches à la fin de la file d'attente
en appelantsouviens-toi("épicerie"),et quand tu es prêt à faire quelque chose, tu appellesobtenir la
tâche ()pour obtenir (et supprimer) l'élément de premier plan de la file d'attente.

se souvenir d'urgencela fonction ajoute également une tâche mais l'ajoute au début plutôt qu'à la

fin de la file d'attente.

Pour rechercher une valeur spécifique, les tableaux fournissent unindexDeméthode. La


méthode recherche dans le tableau du début à la fin et renvoie l'index auquel la valeur
demandée a été trouvée, ou -1 si elle n'a pas été trouvée. Pour rechercher à partir de la fin
au lieu du début, il existe une méthode similaire appeléedernierIndexDe:

console.log([1,2,3,2,1].indexDe(2)); // → 1

console.log([1,2,3,2,1].lastIndexOf(2)); // → 3

Les deuxindexDeetdernierIndexOfprenez un deuxième argument facultatif qui


indique où commencer la recherche.

Une autre méthode fondamentale de tableau esttranche,qui prend les indices de début et de
fin et renvoie un tableau qui ne contient que les éléments compris entre eux. L'indice de
début est inclusif et l'indice de fin est exclusif.

console.log([0,1,2,3,4].tranche(2,4)); // → [2, 3]

console.log([0,1,2,3,4].tranche(2)); // → [2, 3, 4]

Lorsque l'index de fin n'est pas donné,trancheprendra tous les éléments après l'index de départ. Vous

pouvez également omettre l'index de départ pour copier l'intégralité du tableau.

LeconcaténationLa méthode peut être utilisée pour ajouter des tableaux ensemble afin de créer un nouveau

tableau, de manière similaire à ce que fait l'opérateur + pour les chaînes.

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
L'exemple suivant montre les deuxconcaténationettrancheen action. Il prend un tableau
et un index et renvoie un nouveau tableau qui est une copie du tableau d'origine avec
l'élément à l'index donné supprimé :

fonctionretirer(tableau,indice) {
retourtableau.tranche(0, indice)
. concat(tableau.slice(index + 1));
}
console.log(supprimer(["un","b","c","d","e"],2)); // → ["a", "b", "d",
"e"]

Si tu passesconcaténationun argument qui n'est pas un tableau, cette valeur sera ajoutée au nouveau

tableau comme s'il s'agissait d'un tableau à un seul élément.

Les chaînes et leurs propriétés

Nous pouvons lire des propriétés commelongueureten majusculesà partir de valeurs de chaîne. Mais si nous

essayons d'ajouter une nouvelle propriété, elle ne colle pas.

laisserKim="Kim";
kim.âge =88;
console.log(kim.age);
// → indéfini

Les valeurs de type chaîne, nombre et booléen ne sont pas des objets et, bien que le langage ne se
plaigne pas si vous essayez de définir de nouvelles propriétés sur elles, il ne stocke pas réellement
ces propriétés. Comme mentionné précédemment, ces valeurs sont immuables et ne peuvent pas
être modifiées.

Mais ces types ont des propriétés intégrées. Chaque valeur de chaîne possède un certain nombre de
méthodes. Certaines d'entre elles sont très utiles :trancheetindexDe,qui ressemblent aux méthodes
de tableau du même nom :

console.log("noix de coco".tranche(4,7)); // →
noix
console.log("noix de coco".indexDe("tu")); // → 5

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
Une différence est que la chaîneindexDepeut rechercher une chaîne contenant plusieurs
caractères, tandis que la méthode de tableau correspondante ne recherche qu'un seul
élément :

console.log("un deux trois".indexDe("ee")); // → 11

LegarnitureLa méthode supprime les espaces (espaces, nouvelles lignes, tabulations et


caractères similaires) du début et de la fin d'une chaîne :

console.log(" d'accord\n".garniture()); // →
d'accord

LezéroPadfonction de lachapitre précédentexiste aussi comme méthode. On l'appelle


padDémarreret prend la longueur souhaitée et le caractère de remplissage comme

arguments :

console.log(Chaîne(6).padStart(3,"0")); // → 006

Vous pouvez diviser une chaîne à chaque occurrence d'une autre chaîne avecdiviseret le
rejoindre à nouveau avecrejoindre:

laisserphrase=« Les secrétaires oiseaux sont spécialisés dans le


piétinement »; laissermots= phrase.split(" "); console.log(mots);

// → ["Secretarybirds", "spécialisé", "dans", "piétinant"]


console.log(mots.join(". "));
// → Les Secretarybirds se spécialisent dans le piétinement

Une chaîne peut être répétée avec lerépéterméthode qui crée une nouvelle chaîne
contenant plusieurs copies de la chaîne d'origine, collées ensemble :

console.log("LA".répéter(3)); // →
LALALA

Nous avons déjà vu les types de chaînelongueurpropriété. L'accès aux caractères


individuels d'une chaîne ressemble à l'accès aux éléments d'un tableau (avec un

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
complication dont nous discuterons dansChapitre 5).

laisserchaîne="abc";
console.log(chaîne.longueur); // → 3

console.log(chaîne[1]); // → b

Paramètres de repos

Il peut être utile qu'une fonction accepte un nombre quelconque d'arguments. Par exemple,
Math.maxcalcule le maximum detousles arguments qui lui sont donnés. Pour écrire une telle

fonction, vous mettez trois points avant le dernier paramètre de la fonction, comme ceci :

fonctionmax(...Nombres) {
laisserrésultat= -Infini; pour(laisser
nombredenombres) {
si(nombre > résultat) résultat = nombre ;
}
retourrésultat;
}
console.log(max(4,1,9, -2)); // → 9

Lorsqu'une telle fonction est appelée, laparamètre de reposest lié à un tableau contenant tous
les autres arguments. S'il y a d'autres paramètres avant lui, leurs valeurs ne font pas partie de ce
tableau. Lorsque, comme dansmax,c'est le seul paramètre, il contiendra tous les arguments.

Vous pouvez utiliser une notation similaire à trois points pourappelune fonction avec un tableau

d'arguments.

laisserNombres= [5,1,7];
console.log(max(...nombres)); // → 7

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
Cela « étend » le tableau dans l’appel de fonction, en passant ses éléments comme
arguments séparés. Il est possible d’inclure un tableau comme celui-ci avec d’autres
arguments, comme dansmax(9, ...nombres, 2).

La notation de tableau entre crochets permet également à l'opérateur à triple point d'étendre un
autre tableau dans le nouveau tableau :

laissermots= ["jamais","pleinement"]; console.log(["volonté"


, ...mots,"comprendre"]); // → ["ne comprendra jamais",
"complètement", "ne comprendra pas"]

Cela fonctionne même dans les objets entre accolades, où toutes les propriétés d'un autre objet sont
ajoutées. Si une propriété est ajoutée plusieurs fois, la dernière valeur ajoutée l'emporte :

laissercoordonnées= {x:10,et:0};
console.log({...coordonnées,et:5,j:1}); // → {x: 10, y: 5, z:
1}

L'objet Math

Comme nous l'avons vu,Mathématiquesest un ensemble de fonctions utilitaires liées aux nombres telles que

Math.max (maximum),Math.min (minimum), etMath.sqrt (racine carrée).

LeMathématiquesL'objet est utilisé comme conteneur pour regrouper un ensemble de fonctionnalités connexes.

Il n'y en a qu'unMathématiquesobjet, et il n'est presque jamais utile comme valeur. Au contraire, il fournit une

espace de nomsafin que toutes ces fonctions et valeurs ne doivent pas nécessairement être des liaisons

globales.

Avoir trop de liaisons globales « pollue » l'espace de noms. Plus il y a de noms pris, plus
vous risquez d'écraser accidentellement la valeur d'une liaison existante. Par exemple,
il n'est pas improbable que vous souhaitiez nommer quelque chosemaxdans l'un de vos
programmes. Étant donné que JavaScript est intégrémax
la fonction est bien rangée à l'intérieur duMathématiquesobjet, vous n'avez pas à vous soucier
de l'écraser.

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
De nombreux langages vous arrêteront, ou au moins vous avertiront, lorsque vous définissez
une liaison avec un nom déjà pris. JavaScript fait cela pour les liaisons que vous avez
déclarées aveclaisserouconstantemais — perversement — pas pour les liaisons standard ni
pour les liaisons déclarées avecvaroufonction.

Retour à laMathématiquesobjet. Si vous avez besoin de faire de la trigonométrie,Mathématiquespeut


aider. Il contientparce que (cosinus),péché (sinus), etbronzer (tangente), ainsi que leurs fonctions
inverses,acos, asin,etâne,respectivement. Le nombre π (pi) — ou au moins l'approximation la plus
proche qui correspond à un nombre JavaScript — est disponible sous la forme
Math.PI.Il existe une vieille tradition de programmation consistant à écrire les noms des

valeurs constantes en majuscules.

fonctionPointAléatoireSurCercle(rayon) {
laisserangle= Math.aléatoire() *2* Math.PI; retour{x:
rayon * Math.cos(angle),
et: rayon * Math.sin(angle)};
}
console.log(randomPointOnCircle(2)); // → {x :
0,3667, y : 1,966}

Si vous n'êtes pas familier avec les sinus et les cosinus, ne vous inquiétez pas. Je les expliquerai

quand ils seront utilisés dansChapitre 14.

L'exemple précédent utiliséMath.aléatoire.Il s'agit d'une fonction qui renvoie un nouveau


nombre pseudo-aléatoire compris entre 0 (inclus) et 1 (exclu) à chaque fois que vous
l'appelez :

console.log(Math.aléatoire()); // →
0,36993729369714856
console.log(Math.aléatoire()); // →
0,727367032552138
console.log(Math.aléatoire()); // →
0,40180766698904335

Bien que les ordinateurs soient des machines déterministes (ils réagissent toujours de la même manière

si on leur donne la même entrée), il est possible de leur faire produire des nombres qui semblent

aléatoires. Pour ce faire, la machine conserve une valeur cachée et, chaque fois que vous lui demandez

un nouveau nombre aléatoire, elle exécute une opération compliquée.

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
calculs sur cette valeur cachée pour créer une nouvelle valeur. Il stocke une nouvelle valeur et
renvoie un nombre dérivé de celle-ci. De cette façon, il peut produire des nombres toujours
nouveaux et difficiles à prédire d'une manière quisemblealéatoire.

Si nous voulons un nombre aléatoire entier au lieu d'un nombre fractionnaire, nous pouvons utiliser

Math.étage (qui arrondit au nombre entier inférieur le plus proche) sur le résultat de
Math.aléatoire :

console.log(Math.floor(Math.random() *10)); // → 2

En multipliant le nombre aléatoire par 10, on obtient un nombre supérieur ou égal à


0 et inférieur à 10.Math.étagearrondie à l'inférieur, cette expression produira, avec
une chance égale, n'importe quel nombre de 0 à 9.

Il y a aussi les fonctionsMath.ceil (pour « plafond », qui arrondit à un nombre entier),


Math.round (au nombre entier le plus proche), etMath.abs, qui prend la valeur absolue
d'un nombre, ce qui signifie qu'il nie les valeurs négatives mais laisse les valeurs
positives telles qu'elles sont.

Déstructuration

Revenons à laphifonctionner pendant un moment.

fonctionphi(tableau) {
retour(tableau[3] * tableau[0] - tableau[2] * tableau[1]) /
Math.sqrt((tableau[2] + tableau[3]) *
(tableau[0] + tableau[1]) *
(tableau[1] + tableau[3]) *
(tableau[0] + tableau[2]));
}

L'une des raisons pour lesquelles cette fonction est difficile à lire est que nous avons une liaison
pointant vers notre tableau, mais nous préférerions de loin avoir des liaisons pour leélémentsdu
tableau, c'est-à-dire,soit n00 = table[0]et ainsi de suite. Heureusement, il existe une manière succincte
de le faire en JavaScript :

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
fonctionphi([n00,n01,n10,n11]) {
retour(n11 * n00 - n10 * n01) /
Math.sqrt((n10 + n11) * (n00 + n01) *
(n01 + n11) * (n00 + n10));
}

Cela fonctionne également pour les liaisons créées aveclaisser, var,ouconstanteSi vous savez que la
valeur que vous liez est un tableau, vous pouvez utiliser des crochets pour « regarder à l’intérieur »
de la valeur, en liant son contenu.

Une astuce similaire fonctionne pour les objets, en utilisant des accolades au lieu de crochets.

laisser{nom} = {nom:"Faraji",âge:23};
console.log(nom);
// → Faraji

Notez que si vous essayez de déstructurernulouindéfini,vous obtenez une erreur, comme si


vous essayiez d'accéder directement à une propriété de ces valeurs.

Accès optionnel à la propriété

Lorsque vous n'êtes pas sûr qu'une valeur donnée produit un objet, mais que vous souhaitez quand même lire une

propriété à partir de celui-ci lorsqu'elle le fait, vous pouvez utiliser une variante du point

notation:objet?.propriété.

fonction ville(objet)
retour { objet.adresse?.ville;
}
console.log(ville({adresse: {ville: // → « Toronto »}}));
Toronto
console.log(ville({nom:"Véra"})); // → indéfini

L'expressionun?.bsignifie la même chose queun bquandunn'est pas nul ou indéfini. Lorsque


c'est le cas, il est évalué àindéfini.Cela peut être pratique lorsque, comme dans l'exemple,
vous n'êtes pas sûr qu'une propriété donnée existe ou lorsqu'une variable peut contenir
une valeur indéfinie.

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
Une notation similaire peut être utilisée avec l'accès entre crochets, et même avec les
appels de fonction, en plaçant ?. devant les parenthèses ou les crochets :

console.log("chaîne".pas une méthode ?.()); // →


indéfini
console.log({}.arrayProp?.[0]); // →
indéfini

JSON

Étant donné que les propriétés saisissent leur valeur plutôt que de la contenir, les objets et les
tableaux sont stockés dans la mémoire de l'ordinateur sous forme de séquences de bits
contenant la valeur. adresses—l'emplacement en mémoire— de leur contenu. Un tableau
contenant un autre tableau se compose (au moins) d'une région mémoire pour le tableau interne
et d'une autre pour le tableau externe, contenant (entre autres) un nombre qui représente
l'adresse du tableau interne.

Si vous souhaitez enregistrer des données dans un fichier pour plus tard ou les envoyer à un autre
ordinateur via le réseau, vous devez d'une manière ou d'une autre convertir ces enchevêtrements
d'adresses mémoire en une description qui peut être stockée ou envoyée.pourraitenvoyez toute la
mémoire de votre ordinateur avec l'adresse de la valeur qui vous intéresse, je suppose, mais cela ne
semble pas être la meilleure approche.

Ce que nous pouvons faire estsérialiserles données. Cela signifie qu'elles sont converties en une
description plate. Un format de sérialisation populaire est appeléJSON((prononcé « Jason »), qui
signifie JavaScript Object Notation. Il est largement utilisé comme format de stockage et de
communication de données sur le Web, même avec d'autres langages que JavaScript.

JSON ressemble à la façon dont JavaScript écrit des tableaux et des objets, avec quelques restrictions.
Tous les noms de propriétés doivent être entourés de guillemets doubles et seules les expressions de
données simples sont autorisées : aucun appel de fonction, aucune liaison ni aucun élément
impliquant un calcul réel. Les commentaires ne sont pas autorisés dans JSON.

Une entrée de journal peut ressembler à ceci lorsqu'elle est représentée sous forme de données JSON :

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
{
"écureuil": FAUX,
"événements": ["travail","arbre touché","pizza","en cours d'exécution"]
}

JavaScript nous donne les fonctionsJSON.stringifyetJSON.analysepour convertir des données


vers et depuis ce format. Le premier prend une valeur JavaScript et renvoie une chaîne
codée en JSON. Le second prend une telle chaîne et la convertit en la valeur qu'elle code :

laisserchaîne= JSON.chaîne de caractères({écureuil: FAUX,


événements: ["fin de semaine"]});
console.log(chaîne);
// → {"écureuil":false,"événements":["week-end"]}
console.log(JSON.parse(chaîne).événements); // → ["week-
end"]

Résumé

Les objets et les tableaux permettent de regrouper plusieurs valeurs en une seule valeur.
Cela nous permet de mettre un tas d'éléments liés dans un sac et de courir avec le sac au
lieu d'enrouler nos bras autour de tous les éléments individuels et d'essayer de les tenir
séparément.

La plupart des valeurs en JavaScript ont des propriétés, à l'exception denulet


indéfini.Les propriétés sont accessibles à l'aide devaleur.propouvaleur["prop"].
Les objets ont tendance à utiliser des noms pour leurs propriétés et à en stocker un ensemble plus
ou moins fixe. Les tableaux, en revanche, contiennent généralement des quantités variables de
valeurs conceptuellement identiques et utilisent des nombres (à partir de 0) comme noms de leurs
propriétés.

Làsontcertaines propriétés nommées dans des tableaux, telles quelongueuret un certain nombre de

méthodes. Les méthodes sont des fonctions qui résident dans des propriétés et (généralement) agissent

sur la valeur dont elles sont une propriété.

Vous pouvez parcourir des tableaux en utilisant un type spécial depourboucle:pour (laisser

élément du tableau).

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
Exercices

La somme d'une plage

Leintroductionde ce livre a fait allusion à ce qui suit comme une bonne façon de calculer la
somme d'une plage de nombres :

console.log(somme(plage(1,10)));

Écrire ungammefonction qui prend deux arguments,commenceretfin,et renvoie un


tableau contenant tous les nombres decommencerjusqu'à et y comprisfin.

Ensuite, écrivez unsommeFonction qui prend un tableau de nombres et renvoie la somme de


ces nombres. Exécutez le programme d'exemple et voyez s'il renvoie effectivement 55.

En guise de tâche bonus, modifiez votregammefonction permettant de prendre un troisième


argument optionnel qui indique la valeur de « pas » utilisée lors de la construction du tableau. Si
aucun pas n'est indiqué, les éléments doivent augmenter par incréments de un, ce qui correspond à
l'ancien comportement. L'appel de fonctionplage(1, 10, 2)devrait revenir [1, 3, 5, 7, 9].Assurez-vous que
cela fonctionne également avec des valeurs d'étape négatives afin que
plage(5, 2, -1)produit [5, 4, 3, 2].

// Votre code ici.

console.log(plage(1,10));
// → [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] console.log(plage(
5,2, -1)); // → [5, 4, 3, 2]
console.log(somme(plage(1,10))); // → 55

Afficher des astuces...

Inverser un tableau

Les tableaux ont uninverseméthode qui modifie le tableau en inversant l'ordre dans lequel
ses éléments apparaissent. Pour cet exercice, écrivez deux fonctions,

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
tableau inverséetreverseArrayInPlace.Le premier,tableau inversé,devrait
prendre un tableau comme argument et produire unnouveautableau qui a les mêmes
éléments dans l'ordre inverse. Le deuxième,reverseArrayInPlace,devrait faire ce que le
inversela méthode fait :modifierle tableau donné comme argument en inversant ses
éléments. Aucun des deux ne peut utiliser la normeinverseméthode.

En repensant aux notes sur les effets secondaires et les fonctions pures dans lechapitre
précédent, quelle variante pensez-vous être utile dans plus de situations ? Laquelle est la plus
rapide ?

// Votre code ici.

laissermonTableau= ["UN","B","C"];
console.log(reverseArray(monTableau)); // →
["C", "B", "A"]; console.log(monTableau);

// → ["A", "B", "C"];


laissertableauValeur= [1,2,3,4,5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);
// → [5, 4, 3, 2, 1]

Afficher des astuces...

Une liste

En tant que blobs génériques de valeurs, les objets peuvent être utilisés pour créer toutes sortes de structures

de données. Une structure de données courante est laliste(à ne pas confondre avec les tableaux). Une liste est

un ensemble imbriqué d'objets, le premier objet contenant une référence au deuxième, le deuxième au

troisième, et ainsi de suite :

laisserliste= {
valeur:1,
repos: {
valeur:2,
repos: {
valeur: 3,
repos: nul
}

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
}
};

Les objets résultants forment une chaîne, comme le montre le diagramme suivant :

valeur: 1
valeur: 2
repos: valeur: 3
repos:
reste : nul

L'avantage des listes est qu'elles peuvent partager des parties de leur structure. Par
exemple, si je crée deux nouvelles valeurs {valeur : 0, reste : liste}et {valeur:
- 1, reste : liste} (avecliste(en référence à la liaison définie précédemment), ce sont toutes deux des listes

indépendantes, mais elles partagent la structure qui constitue leurs trois derniers éléments. La liste
originale est également toujours une liste valide à trois éléments.

Écrire une fonctiontableauToListqui construit une structure de liste comme celle montrée
lorsqu'on lui donne [1, 2, 3]comme argument. Écrivez également unlisteVersTableaufonction
qui produit un tableau à partir d'une liste. Ajoutez les fonctions d'assistancepréfixer,qui prend
un élément et une liste et crée une nouvelle liste qui ajoute l'élément au début de la liste
d'entrée, etn-ième,qui prend une liste et un nombre et renvoie l'élément à la position donnée
dans la liste (avec zéro faisant référence au premier élément) ouindéfiniquand il n’y a pas un
tel élément.

Si vous ne l'avez pas déjà fait, écrivez également une version récursive denième.

// Votre code ici.

console.log(arrayToList([10,20]));
// → {valeur : 10, reste : {valeur : 20, reste : null}}
console.log(listeVersArray(tableauVersListe([10,20,30]))); // → [10, 20,
30]
console.log(préfixe(10, préfixer(20,nul))); // → {valeur : 10,
reste : {valeur : 20, reste : null}} console.log(nth(arrayToList([10
,20,30]),1)); // → 20

Afficher des astuces...

Comparaison approfondie

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF
L'opérateur == compare les objets par identité, mais parfois vous préférez
comparer les valeurs de leurs propriétés réelles.

Écrire une fonctionprofondÉgalqui prend deux valeurs et renvoievraiseulement s'ils


ont la même valeur ou sont des objets avec les mêmes propriétés, où les valeurs des
propriétés sont égales lorsqu'elles sont comparées à un appel récursif à
profondÉgal.

Pour savoir si les valeurs doivent être comparées directement (en utilisant l'opérateur === pour
cela) ou si leurs propriétés doivent être comparées, vous pouvez utiliser l'type de
opérateur. Si cela produit "objet"pour les deux valeurs, il faut faire une comparaison
approfondie. Mais il faut tenir compte d'une exception stupide : à cause d'un accident
historique,type de nulproduit également "objet".

LeObjet.clésLa fonction sera utile lorsque vous aurez besoin de parcourir les
propriétés des objets pour les comparer.

// Votre code ici.

laisserobjet= {ici: {est:"un"},objet:2};


console.log(deepEqual(obj, obj));
// → vrai
console.log(deepEqual(obj, {ici:1,objet:2})); // → faux

console.log(deepEqual(obj, {ici: {est:"un"},objet:2})); // → vrai

Afficher des astuces...

Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF

Vous aimerez peut-être aussi