Eloquentjavascript Net 04 Data
Eloquentjavascript Net 04 Data
com
«À 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.
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,
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.
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
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
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
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
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
Tout comme les chaînes, les tableaux ont unelongueurpropriété qui nous indique combien
Méthodes
Les valeurs de chaîne et de tableau contiennent toutes deux, en plus delongueurpropriété, un certain
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
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.
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.
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
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"]
// → {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.
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
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 :
objet1.valeur =15;
console.log(objet2.valeur); // → 15
console.log(objet3.valeur); // → 10
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.
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
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.
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
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
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
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,
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.
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
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;
}
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é.
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
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.
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
L'analyse finale
Nous devons calculer une corrélation pour chaque type d'événement qui se produit dans l'ensemble de
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
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.
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
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.
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
console.log([1,2,3,2,1].indexDe(2)); // → 1
console.log([1,2,3,2,1].lastIndexOf(2)); // → 3
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
LeconcaténationLa méthode peut être utilisée pour ajouter des tableaux ensemble afin de créer un nouveau
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
Nous pouvons lire des propriétés commelongueureten majusculesà partir de valeurs de chaîne. Mais si nous
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(" d'accord\n".garniture()); // →
d'accord
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:
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
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 :
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
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.
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
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
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
Déstructuration
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
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
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 :
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"]
}
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.
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
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
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)));
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
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 ?
laissermonTableau= ["UN","B","C"];
console.log(reverseArray(monTableau)); // →
["C", "B", "A"]; console.log(monTableau);
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
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.
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
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.
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.
Découvrez notre solution conviviale pour les développeursAPI HTML vers PDF Imprimé en utilisantPDFCrowd Conversion HTML en PDF