JavaScript From Cisco Academy
JavaScript From Cisco Academy
utilisateur sur les pages web en ajoutant de l'interactivité. En raison de sa simplicité et de son
élégance, le JavaScript est devenu l'un des langages les plus largement utilisés pour le
développement web interactif, et il alimente une grande partie d'internet. Au fil des ans, le
JavaScript est devenu si populaire qu'il n'est plus uniquement utilisé pour le développement
web. Aujourd'hui, il est utilisé par des entreprises et des particuliers dans le monde entier
pour créer toutes sortes de logiciels. En raison de son utilisation mondiale, l'apprentissage du
JavaScript est fondamental pour devenir programmeur et obtenir un premier emploi dans le
secteur de la technologie.
Découvrez comment les applications web et mobiles interactives sont créées avec ce langage
de programmation textuel. Vous apprendrez ensuite à programmer vos propres
applications ! Ce cours est idéal pour débuter en programmation, aucune connaissance
préalable n'est requise. Il est aligné sur la certification JSE - Certified Entry-Level JavaScript
Programmer Certification et a été développé en collaboration avec le JS Institute. Une fois
certifié, vous pourrez mettre en avant vos nouvelles compétences auprès des employeurs.
Les compétences en programmation vous ouvrent les portes de carrières dans presque tous
les secteurs et sont indispensables si vous souhaitez accéder à des postes plus avancés et
mieux rémunérés dans le développement web, d'applications mobiles ou de jeux. Lancez-
vous dès aujourd'hui !
1.0.1 À propos du cours
Ce cours a été conçu et développé par l'OpenEDG JS Institute, et mis en œuvre par la Cisco
Networking Academy.
Ce cours est le premier d'une série de 2 cours qui vous prépareront aux examens de
certification JSE – Certified Entry-Level JavaScript Programmer et JSA – Certified Associate
JavaScript Programmer.
L'objectif principal du cours est de vous guider d'un état d'analphabétisme complet en
programmation à un niveau de connaissances en programmation qui vous permettra de
concevoir, écrire, déboguer et exécuter des programmes codés dans le langage JavaScript, et
de comprendre les concepts de base de la technologie de développement logiciel.
Le cours se concentre sur les concepts fondamentaux du langage JavaScript, y compris les
éléments essentiels de la syntaxe et de la sémantique de JavaScript, les meilleures pratiques
de programmation, les outils et ressources JS, et les concepts de codage tels que les
variables, les types de données, le transtypage, les opérateurs, l'interaction utilisateur, le flux
de contrôle, les fonctions, les erreurs, les exceptions, le débogage et le dépannage.
Module 1
Module 3
Module 4
Module 5
Fonctions ;
Module 6
1.0.3 Programme
Module 1
Module 2
Types de données primitifs (Boolean, Number, BigInt, String, undefined, null, transtypage –
fonctions de construction primitives et conversions primitives, conversions implicites)
Commentaires (commentaires sur une seule ligne, commentaires sur plusieurs lignes,
documentation)
Module 3
Opérateurs d'affectation, arithmétiques et logiques (ce que sont les opérateurs, opérateurs
d'affectation, opérateurs arithmétiques, opérateurs logiques, opérateurs d'affectation
composés)
Module 4
Boucles (ce que sont les boucles, la boucle while, la boucle do–while, la boucle for, la boucle
for–of, la boucle for–in, les instructions break et continue)
Module 5
Fonctions
Bases des fonctions (ce que sont les fonctions, déclaration des fonctions, appel des fonctions,
variables locales, l'instruction return, paramètres de fonction, masquage)
Les fonctions en tant que membres de première classe (expressions de fonction, passage
d'une fonction en tant que paramètre, rappels)
Module 6
Gestion des exceptions (l'instruction try–catch, l'instruction finally, l'instruction throw et les
erreurs personnalisées)
Débogage et dépannage du code (ce qu'est le débogage, exécution pas à pas, affichage et
modification des variables, l'option de sortie, mesure du temps d'exécution du code)
1.0.4 Objectifs
Module 1
aurez les connaissances et les compétences nécessaires pour travailler avec les variables
(c'est-à-dire les nommer, les déclarer, les initialiser et modifier leurs valeurs) ;
comprendrez des concepts tels que la portée, les blocs de code, le masquage et le hissage
(hoisting) ;
connaîtrez les propriétés de base des types de données primitifs tels que boolean, number,
bigint, undefined, null, et serez capable de les utiliser ;
serez familiarisé avec les propriétés de base du type de données primitif string, y compris les
littéraux de chaîne – guillemets simples ou doubles, le caractère d'échappement,
l'interpolation de chaînes, les propriétés et méthodes de base ;
connaîtrez les propriétés de base des types de données complexes tels que Array et Object
(traités comme un enregistrement) et serez capable de les utiliser en pratique.
Module 3
saurez ce que sont les opérateurs et comment les classer (par type d'opérande, par nombre
d'opérandes, etc.) ;
Module 4
serez capable de forcer la répétition d'un groupe d'instructions dans une boucle à l'aide des
commandes for, while et do-while, en utilisant des conditions dépendantes et indépendantes
du nombre d'itérations ;
comprendrez et serez capable d'utiliser les instructions break et continue spécifiques aux
boucles ;
serez capable d'utiliser l'instruction for-in pour itérer sur les propriétés d'un objet ;
serez capable d'utiliser l'instruction for-of pour parcourir les éléments d'un tableau.
Module 5
saurez comment passer des arguments d'appel à une fonction et en renvoyer le résultat de
son opération ;
saurez qu'une fonction en JS est un membre de première classe et serez capable d'en tirer
parti en déclarant des fonctions à l'aide d'expressions de fonction et en passant des fonctions
comme arguments aux appels d'autres fonctions ;
Ce cours sera un long voyage, mais si vous allez jusqu’au bout, vous serez capable de lire,
comprendre et bien sûr écrire des applications et des programmes en JavaScript. Ces
nouvelles compétences pourront vous être utiles dans votre travail actuel ou vous ouvrir de
nouvelles opportunités de carrière dans un marché informatique en constante croissance.
Commençons donc cette aventure sans plus attendre et découvrons ce qu’est JavaScript.
Vous êtes presque certainement en train de lire ce cours sur un ordinateur ; votre téléphone
est un ordinateur ; on trouve des ordinateurs dans les télévisions et dans d’autres appareils
électroménagers, comme votre aspirateur automatique, qui utilise son ordinateur et de
nombreux capteurs dans sa mission sans fin d’éradiquer la poussière de votre vie.
Nous sommes entourés d’ordinateurs. Ils sont utilisés dans les sciences, la médecine, la
banque et les affaires.
Il semble qu’aujourd’hui il serait difficile de trouver un domaine de la vie dans lequel les
ordinateurs ne participent pas activement.
Nous utilisons principalement les ordinateurs parce qu’ils sont capables d’accomplir
certaines tâches incomparablement plus vite et plus précisément que les humains.
Cependant, les ordinateurs ne peuvent pas deviner quelles tâches nous avons en tête ni
comment nous aider à les accomplir. Nous devons leur dire. Comment ? Le mieux est de le
faire d’une manière semblable à celle utilisée pour transmettre une information à une autre
personne, autrement dit en utilisant un langage compréhensible par les deux parties. Avec
un tel langage, nous écrivons un programme, c’est-à-dire une solution formalisée à notre
problème, qui peut être exécutée par l’ordinateur.
Pour faciliter la communication avec l’ordinateur, les langages de programmation ont donc
été inventés. Ils sont plus ou moins proches des langages naturels (c’est-à-dire ceux utilisés
pour communiquer entre humains). Il existe des milliers de langages de programmation, qui
diffèrent par leur objectif (à côté des langages généraux, il y a de nombreux langages
spécialisés, par exemple conçus uniquement pour les calculs statistiques), leur niveau
d’abstraction (en termes simples : plus le langage est de haut niveau, moins nous devons
connaître les détails du matériel sur lequel le programme est exécuté), leur facilité
d’utilisation, l’efficacité des programmes écrits avec eux, etc.
JavaScript est un langage interprété typique. Si nous exécutons du code écrit en JavaScript
dans un navigateur web, comme cela se produit après le chargement de la page que nous
lisons actuellement (oui, oui, il y a aussi des éléments écrits en JavaScript sur cette page),
l’interpréteur sera le moteur JavaScript intégré au navigateur. Ce n’est pas la seule façon
d’exécuter du code JavaScript.
Peut-être avez-vous entendu parler de Node.js. C’est aussi un interpréteur, mais installé
indépendamment des navigateurs, comme un environnement dans le système d’exploitation
de l’ordinateur (que ce soit macOS, Windows ou Linux). Grâce à Node.js, vous pouvez écrire
des programmes en JavaScript qui, par exemple, transformeront votre ordinateur en serveur.
En début de paragraphe, nous avons un peu simplifié les choses. JavaScript est un langage
interprété – cela ne fait aucun doute. Et en fait, exécuter un programme écrit en JavaScript
donne l’impression que nous exécutons notre code source (c’est-à-dire le code que nous
avons écrit) instruction par instruction. Toutefois, vous pourriez rencontrer des informations
un peu différentes concernant ce langage et plus précisément certains interpréteurs.
Quel que soit le langage choisi, certaines choses restent les mêmes lors de l’écriture d’un
programme. Avant tout, une étape importante, et probablement la plus difficile, consiste à
définir correctement le problème que nous voulons résoudre. Ce n’est qu’ensuite que nous
cherchons la solution optimale, que nous présenterons enfin sous la forme d’un programme
écrit dans le langage choisi.
Un exemple simple dans un autre domaine : il vous est probablement arrivé d’acheter un
meuble à monter vous-même. L’assemblage est un problème qui vous est confié en tant
qu’acheteur. Pour vous aider, vous recevez un ensemble d’instructions qui vous guident dans
tout le processus. Vous agissez alors comme un interpréteur, en suivant un programme qui
vous permet de mener la tâche à bien. Le succès de votre mission dépend de la qualité de
ces instructions : sont-elles précises, non ambiguës, et correspondent-elles bien au meuble
acheté ? Sinon, vous risquez de construire non pas le meuble de vos rêves, mais une
construction surréaliste venue d’une autre dimension.
Pour que les instructions soient bonnes, leur concepteur doit savoir exactement ce qu’elles
doivent illustrer, dans quel ordre les actions doivent être réalisées, à quelles étapes on risque
de se tromper, etc. Et bien sûr, il doit connaître l’effet attendu à la fin.
Au début des années 1990, toutes les pages web étaient statiques. Les choses ont changé en
1995, lorsque la société Netscape a embauché Brendan Eich et lui a confié la mission de
développer un nouveau langage pour son navigateur Netscape Navigator. Le nouveau
langage s’appelait LiveScript, mais peu après son nom fut changé en JavaScript. Sa tâche
principale était d’ajouter du dynamisme aux sites web, permettant par exemple des
interactions plus complexes avec l’utilisateur. Ainsi commença la carrière de JavaScript.
L’utilisation de JavaScript sur les sites web, qui avec le temps est devenue de plus en plus
complexe et souvent dotée de logiques très sophistiquées, est appelée programmation côté
client. Le code à exécuter est chargé avec la page dans le navigateur, du côté de l’utilisateur,
et l’interpréteur intégré au navigateur permet son exécution.
Aujourd’hui, JavaScript est le seul langage pris en charge par tous les grands navigateurs web,
et environ 95 % des pages web dans le monde contiennent du code JavaScript. Dès le début,
les pages web ont utilisé JavaScript côté client pour ajouter de l’interactivité et modifier
dynamiquement le contenu.
Mais aujourd’hui, JavaScript est bien plus que cela, car il propose de nombreux frameworks
puissants pour construire d’énormes applications web complexes et des réseaux sociaux
(vous avez sans doute entendu parler de frameworks comme React ou Angular).
Tout cela fonctionne sur une grande variété d’équipements, des stations de travail très
performantes aux simples smartphones. Grâce à la puissance de JavaScript, nous pouvons
commander de la nourriture, jouer à des jeux dans le navigateur, regarder des films sur des
plateformes de streaming et rester en contact permanent avec les personnes qui comptent
pour nous. JavaScript est si populaire que de plus en plus d’efforts sont consacrés à son
utilisation, pas seulement côté client.
Nous disons que JavaScript est un langage mature, ce qui signifie que la plupart des
fonctionnalités sont déjà implémentées et stables, et qu’il est peu probable que de grands
changements apparaissent dans le langage. Depuis 2015, de nombreux aspects de JavaScript
ont évolué, et de nombreuses nouvelles fonctionnalités ont été ajoutées. Beaucoup de ces
changements ont été introduits pour faciliter la migration vers JavaScript des programmeurs
connaissant d’autres langages populaires, avec lesquels JavaScript différait fortement sur
certains points, comme la gestion des objets.
On peut toujours utiliser le langage à l’ancienne, mais il est plutôt recommandé d’utiliser le
JavaScript moderne.
Mais… il n’existe pas de solutions idéales, et donc pas de langage de programmation parfait
pour toutes les applications. Chacun a ses propres limites, et JavaScript ne fait pas exception.
Malgré sa popularité et son succès, JavaScript n’est pas un langage parfait. De par sa nature,
il ne convient pas à certaines applications. Par exemple, il est inutile de l’utiliser pour écrire
des programmes nécessitant des calculs mathématiques avancés ou des performances très
élevées.
Certaines limitations viennent du concept même du langage, mais la majorité est liée à la
plateforme sur laquelle nous l’utilisons. Cela se remarque surtout lors de l’écriture de code
exécuté dans un navigateur, ce que nous avons appelé plus tôt le côté client. Dans ce cas,
JavaScript est limité par le fait que les navigateurs, pour des raisons de sécurité, exécutent le
code des scripts dans un environnement bac à sable (séparé du monde extérieur), ce qui
empêche l’accès aux fichiers et ressources locales (c’est-à-dire ceux présents sur l’ordinateur
où le navigateur est lancé).
Un autre inconvénient est que, comme le code n’est pas compilé, il est transmis au
navigateur dans une forme identique ou très proche de celle que nous avons écrite. Pourquoi
est-ce un problème ? Parce que tout le monde peut lire facilement notre solution et l’utiliser
(en copiant des morceaux ou même la totalité) sans notre autorisation pour écrire son
propre programme.
Un moyen de protection est l’obfuscation du code, qui consiste à transformer notre script
final en une forme moins lisible (par exemple en générant des noms de variables et de
fonctions courts et aléatoires, en supprimant les retours à la ligne, etc.). Mais le fait est que si
quelqu’un veut vraiment voler notre code JavaScript, il y a très peu de choses que nous
pouvons faire pour l’en empêcher.
D’un autre côté, JavaScript possède de nombreux avantages par rapport aux autres langages
de programmation, et l’un des plus grands est l’existence d’une communauté très active et
solidaire. Il est facile de trouver des solutions aux problèmes courants et d’obtenir de l’aide
en général. Cela signifie aussi que les outils liés à JavaScript sont constamment développés.
De plus, JavaScript ne vous oblige pas à acheter des outils coûteux pour travailler :
d’excellents outils sont déjà intégrés directement dans votre navigateur. Enfin, et ce n’est pas
le moindre avantage, de grands acteurs comme Google, Facebook et Mozilla soutiennent
activement les outils JavaScript et leur développement.
Cependant, ce qui est un avantage pour certains peut se révéler un inconvénient pour
d’autres. Un exemple est la typisation dynamique propre à JavaScript. En résumé, cela
signifie que nous pouvons stocker des données de n’importe quel type dans une variable
(une variable étant un conteneur dans lequel nous conservons les données que nous allons
utiliser).
Par exemple, pendant l’exécution d’un programme, nous pouvons stocker le nombre 10 dans
une variable, puis dans l’étape suivante utiliser la même variable pour y stocker la chaîne de
caractères "abc" (ce qui efface automatiquement la valeur précédente – ne vous inquiétez
pas si vous ne comprenez pas tout de suite, nous reviendrons plus tard sur tous ces termes).
La plupart du temps, c’est très pratique, mais certains estiment que cette caractéristique du
langage est un inconvénient. Selon eux, elle facilite les erreurs dans certaines situations. Pour
remédier à cela, un nouveau langage appelé TypeScript a été introduit, ajoutant la typisation
statique (où une variable ne peut contenir qu’un seul type de données, par exemple
uniquement des nombres, pendant toute l’exécution du programme).
Rappelez-vous aussi que si vous apprenez à programmer dans un langage, il vous sera
généralement beaucoup plus facile d’apprendre le suivant, qui pourra être plus adapté pour
résoudre certains problèmes.
Mais commençons avec JavaScript, qui, grâce à sa syntaxe flexible et simple, est parfait
comme premier langage d’apprentissage.
Comme nous l’avons mentionné plus tôt, JavaScript peut être utilisé dans divers
environnements, bien que le plus souvent ce soit un navigateur web ou un serveur avec un
environnement Node.js.
Dans cette partie du cours, nous allons apprendre à programmer en utilisant ce noyau
immuable de JavaScript : comment déclarer des variables, écrire des fonctions, des
instructions conditionnelles ou des boucles – tout cela étant utilisable de la même façon
dans n’importe quel environnement où nous décidons d’utiliser ce langage.
Programmer dans n’importe quel langage n’est pas facile à apprendre, et vous pourrez vous
sentir submergé par tant de nouvelles informations. Mais si vous restez persévérant et
concentré, vous serez capable d’écrire rapidement de petits scripts, et il n’existe pas d’autre
méthode pour apprendre la programmation que d’écrire beaucoup, beaucoup de code.
Le plus important est de ne pas abandonner, même lorsque vous êtes bloqué : faites une
pause, allez marcher, revenez avec un esprit plus frais et essayez à nouveau. En fin de
compte, c’est la persévérance qui mène à la réussite.
Maintenant, commençons !
1.2.1 Outils de développement
Comme toute autre tâche, la programmation nécessite des outils et un espace de travail
appropriés. Le développement logiciel, dans la plupart des cas, requiert un éditeur de code
et un compilateur ou interpréteur d’un langage donné. Il s’agit du minimum requis, que nous
pouvons enrichir au besoin avec divers autres outils.
Les outils en question devront bien sûr être exécutés sur l’ordinateur. À ce stade, ses
performances ne sont pas particulièrement importantes, et toute machine capable de gérer
les tâches bureautiques courantes suffira. Il est donc fortement recommandé de travailler sur
un ordinateur de bureau ou un ordinateur portable.
Il est indéniable que la taille du moniteur influencera le confort de travail. Plus l’écran est
grand, plus il sera facile de placer l’éditeur de code, l’interpréteur et d’autres contenus (par
ex. ce cours) côte à côte. Dans des conditions normales de travail, les programmeurs utilisent
très souvent plusieurs moniteurs.
Le système d’exploitation n’a pas d’importance, car l’outil approprié peut être trouvé pour
Windows, macOS et Linux.
À ce moment, deux choix s’offrent à vous. Vous pouvez installer tous les outils nécessaires
sur votre machine et travailler dans un environnement local. C’est l’approche privilégiée, car
c’est ainsi que cela se passe la plupart du temps dans les projets commerciaux réels. Vous
pouvez également personnaliser le tout selon vos besoins.
Une autre approche consiste à utiliser des outils en ligne. Ils peuvent être pratiques, car vous
n’avez rien à installer ni à configurer – ils fonctionnent immédiatement. La plupart
permettent de stocker votre travail dans un cloud afin que vous puissiez y accéder depuis
différents appareils, mais en contrepartie, ils manquent d’options de personnalisation et
nécessitent une connexion Internet permanente.
Tout le code que vous verrez dans ce cours a été testé à la fois dans des environnements
locaux et en ligne, donc les deux options sont valides. Enfin, nous pouvons passer au choix
des outils.
Les environnements en ligne, communément appelés code playgrounds, sont des sites qui
agissent comme un éditeur simple et un environnement d’exécution. Tous offrent des
ensembles de fonctionnalités similaires. Ils diffèrent par leur interface utilisateur, mais en
principe, ils se comportent de façon semblable. Ils vous permettent d’écrire du code, de
l’exécuter pour des tests, et le plus souvent de le partager avec d’autres utilisateurs.
JSFiddle
CodePen
JsBin
Plunker
N’oubliez pas, cependant, que cette plateforme est une solution purement didactique et de
test, et qu’elle ne peut en aucun cas être utilisée comme un environnement de
développement complet. Elle est néanmoins idéale pour nos besoins, car dans la plupart des
cas, nous pourrons oublier l’environnement web des programmes écrits en JavaScript, y
compris les éléments HTML. Cela nous permettra de nous concentrer uniquement sur
l’apprentissage du langage JavaScript lui-même.
Comme nous l’avons déjà écrit, les exigences de JavaScript pour l’environnement de
développement sont très modestes. Dans la plupart des cas, en particulier au début, trois
éléments suffisent : un éditeur de code, un interpréteur (c’est-à-dire un environnement
exécutable) et un débogueur.
Selon le niveau de sophistication, la complexité du projet écrit ou l’environnement pour
lequel nous écrivons nos programmes (côté client, côté serveur, mobile), d’autres outils
peuvent également être nécessaires.
analyseurs de sécurité – utilisés pour contrôler la sécurité de notre solution (par ex.
Snyk, RetireJS ou OWASP Dependency Check).
L’ouverture des environnements de développement web est à la fois une bénédiction et une
malédiction. Nous avons le choix parmi des centaines de composants, avec lesquels nous
pouvons créer l’environnement le plus confortable pour nous.
Cependant, leur quantité, ainsi que les changements dynamiques des outils particuliers ou
même simplement les tendances parmi les programmeurs, rendent difficile le suivi de tout ce
qui se passe dans ces environnements.
Pour l’instant, nous avons besoin du trio minimal : un éditeur de code, un interpréteur et un
débogueur.
Le code de presque tous les langages de programmation est composé sous une forme de
texte. Donc, pour écrire du code, nous avons besoin d’un éditeur de texte. Mais il doit s’agir
d’une application qui écrit du texte brut (il ne peut pas s’agir d’un éditeur de texte enrichi,
comme MS Word). En d’autres termes, un simple bloc-notes capable d’écrire des fichiers .txt
suffit pour écrire du code, bien qu’il soit beaucoup plus facile d’utiliser un éditeur de code
dédié.
Le marché est plein d’éditeurs de code professionnels, gratuits ou payants. Certains sont
universels, tandis que d’autres sont réservés à des langages spécifiques. Le principal avantage
d’utiliser un éditeur de code dédié est la coloration syntaxique, l’autocomplétion du texte et
la vérification des erreurs. Cela améliore l’efficacité du travail et la compréhension du code,
et réduit le nombre d’erreurs et de fautes de frappe.
Il existe de nombreux bons éditeurs de code, mais il peut être difficile de choisir celui qui
vous conviendra. Voici quelques-uns des plus populaires :
WebStorm
[Windows, macOS, Linux]
Un environnement de développement commercial populaire, dans lequel l’éditeur de
code n’est qu’un des nombreux éléments d’un vaste ensemble d’outils destinés à
améliorer le développement de code (par ex. le support des tests). Conçu pour de
grands projets, il peut s’avérer trop lourd et complexe pour de petits programmes.
Bien qu’il soit destiné à un usage commercial, il est possible d’obtenir une licence
éducative gratuite.
Sublime Text
[Windows, macOS, Linux]
Éditeur de code rapide et facile à utiliser, avec de nombreuses fonctionnalités
avancées comme l’édition multi-lignes, la recherche rapide, et d’autres. Une version
d’essai est disponible, mais pour une utilisation à long terme, une licence doit être
achetée pour un usage privé comme commercial.
Notepad++
[Windows]
Éditeur de texte et de code gratuit et léger. Le programme est petit et rapide, prend
en charge des dizaines de langages de programmation, et peut être enrichi avec des
plugins. Il est peut-être ancien et peu esthétique, mais reste efficace.
Il existe de nombreux autres éditeurs de code, gratuits comme payants, et vous pouvez
utiliser celui qui vous convient le mieux. Beaucoup de développeurs utilisent, entre autres,
des éditeurs en console, dont le légendaire vim. Les éditeurs en console ne s’exécutent pas
dans un environnement graphique, mais dans une console texte. Cependant, vous ne devriez
vous tourner vers de telles solutions que si les tâches que vous allez effectuer vous
paraissent trop simples et que vous souhaitez compliquer un peu votre vie.
1.2.5 Interpréteur
Nous avons déjà un peu parlé de l’interpréteur et de son rôle. Il fonctionne comme un
environnement d’exécution pour notre programme. Il vérifie si nous avons commis des
erreurs formelles, par exemple une faute de frappe dans le nom d’une fonction ou l’oubli de
fermer une parenthèse, puis il exécute le programme instruction par instruction.
Notre cours porte sur le JavaScript de base, c’est-à-dire les éléments du langage qui seront
tout aussi utiles dans les solutions côté client, côté serveur et mobiles. Nous pouvons donc
les pratiquer dans n’importe quel environnement, en utilisant n’importe quel interpréteur. Le
moyen le plus simple consiste à se limiter à un navigateur web.
Comme nous l’avons déjà dit, pratiquement tous les navigateurs possèdent un moteur
JavaScript intégré (ou interpréteur), mais nous recommandons vivement Chrome de Google,
ou Firefox de Mozilla. Tous deux sont réputés pour leur efficacité et leurs outils avancés
intégrés pour les développeurs web (c’est-à-dire vous). Ils sont disponibles pour Windows,
macOS et Linux.
1.2.6 Débogueur
Les programmes informatiques sont des bêtes compliquées, comportant des milliers voire
des millions de lignes de code (mais rassurez-vous, nous commencerons avec seulement
quelques-unes). Avec une telle complexité et une telle taille, il est impossible de produire du
code sans aucune erreur.
Certains types d’erreurs, en particulier les erreurs logiques (formellement, le programme est
écrit correctement, mais il se peut que nous ayons inventé une mauvaise solution au
problème), ne peuvent être trouvés qu’au moment de l’exécution du programme, et souvent
seulement dans des circonstances particulières. Il est très difficile de savoir exactement ce
qui se passe à l’intérieur d’un programme qui s’exécute à toute vitesse, et c’est pour ce type
de problème que les débogueurs existent.
Un débogueur est un outil qui vous permet de ralentir ou même d’arrêter l’exécution d’un
programme, de lancer les instructions pas à pas, et d’observer et analyser l’état du
programme à tout moment.
l’inspecteur – qui permet, par exemple, d’analyser les éléments HTML individuels
d’un site web ouvert ;
la console JavaScript – qui affiche toutes les informations relatives aux erreurs, et
permet également d’exécuter des commandes JavaScript uniques dans le contexte de
la page courante ;
le débogueur – qui, entre autres, montre les valeurs actuelles des variables, et
permet de mettre en pause l’exécution du code à l’endroit indiqué et de travailler pas
à pas (c’est-à-dire exécuter les instructions du programme une par une).
Systèmes Windows et Linux, tous les navigateurs courants sauf Internet Explorer et
Edge :
Dans le prochain chapitre, nous reviendrons sur ce sujet et apprendrons encore quelques
éléments à propos de ces outils utiles.
Dans le chapitre suivant, nous écrirons notre premier code JavaScript. Nous le testerons
d’abord dans l’environnement d’exécution intégré à notre plateforme de formation. Nous
l’utiliserons également pour vérifier le fonctionnement de notre environnement de
développement local. Alors, assurez-vous que les outils que vous avez choisis sont installés et
que vous pouvez les lancer. Si vous ne savez toujours pas quoi choisir, nous vous suggérons
d’utiliser l’environnement local avec Visual Studio Code (notre éditeur de code) et Chrome
(navigateur web avec interpréteur et débogueur JavaScript).
1.3.1 Le programme « Hello, World! »
Pourquoi « Hello, World! » ? Depuis près de 50 ans, cette phrase et ses variantes marquent le
moment où quelqu’un apprend un nouveau langage de programmation, bien que ce soit plus
une tradition qu’autre chose. L’expression a été utilisée il y a longtemps dans un ouvrage très
important sur le langage C, mais le texte en lui-même importe peu.
Dans le cas de JavaScript côté client, afficher quelque chose à l’écran peut être compris de
deux manières.
D’abord, JavaScript côté client est toujours exécuté dans le contexte d’un site web et permet
de manipuler les éléments de ce site. Nous pouvons donc, par exemple, utiliser la fonction
appropriée pour insérer du texte, modifier un titre, créer un tableau, etc. sur la page. De
cette façon, nous contrôlons la partie visuelle du site web.
Ensuite, nous pouvons utiliser la console comme écran pour écrire certaines informations. La
console, comme nous l’avons mentionné dans le chapitre précédent, fait partie des outils de
développement. Elle n’est donc pas visible par défaut et doit être activée correctement (nous
en avons également parlé dans le chapitre précédent). Pour nos besoins, il sera beaucoup
plus pratique d’utiliser la console, car nous éviterons une analyse approfondie de la structure
du site web.
Mais qu’est-ce qu’une console, en réalité ? Tout d’abord, c’est un endroit où s’affichent
différents messages, normalement invisibles pour l’utilisateur du navigateur. Ces messages
peuvent, par exemple, être générés par l’interpréteur JavaScript lorsqu’il rencontre une
erreur, ou lorsqu’on lui demande explicitement de les afficher en appelant la fonction
appropriée. Ensuite, nous pouvons exécuter des instructions JavaScript individuelles dans la
console, qui seront exécutées dans le contexte de la page web actuellement chargée (nous
en reparlerons dans un instant).
La fonction de base qui permet d’écrire des informations dans la console est console.log.
Ainsi, pour faire référence à l’éternel « Hello, World! », nous devrions l’appeler de la manière
suivante :
console.log("Hello, World!");
Nous pouvons considérer console.log comme une fonction*. En réalité, log est la fonction, et
console est l’objet auquel cette fonction appartient.
* Ce type de fonction, qui appartient à un objet, est généralement appelé méthode. Mais
encore une fois, pour simplifier les choses pour l’instant, supposons qu’il s’agit simplement
d’une fonction ordinaire – cela ne nous gênera pas du tout (nous apprendrons les objets
beaucoup plus tard).
Une fonction est un morceau de code qui permet d’accomplir une tâche spécifique (dans
notre cas, afficher quelque chose dans la console). Les fonctions prennent souvent des
arguments, c’est-à-dire des données qu’elles utiliseront pendant leur exécution. En
JavaScript, nous exécutons une fonction en l’appelant, c’est-à-dire en écrivant son nom suivi
de parenthèses, dans lesquelles sont placés les arguments (si la fonction n’a pas besoin
d’arguments, les parenthèses restent vides). Dans notre exemple, l’argument est le texte que
nous voulons afficher. Remarquez que pour indiquer que « Hello, World! » est du texte, nous
le plaçons entre guillemets.
Nous savons déjà ce qu’il faut écrire, et la seule question est : où devons-nous le faire ?
Dans l’éditeur, vous devriez voir le morceau de code que nous venons de discuter, contenant
la fonction console.log. Essayez de l’exécuter.
Vous devez appuyer sur le bouton en surbrillance avec l’icône lecture, situé juste au-dessus
de l’éditeur.
Output
Hello, World!
Retournez ensuite dans l’éditeur et changez le mot "World" par votre prénom. Relancez le
programme et vérifiez ce qui apparaît dans la fenêtre de la console.
Félicitations, vous venez de modifier un programme écrit en JavaScript.
Nous pouvons discuter de votre premier programme JavaScript à partir de cet exemple. Vous
avez appris sa syntaxe, vous l’avez exécuté en ligne, vérifié son effet, et même modifié vous-
même. Vous pouvez tester tous les exemples que nous allons aborder dans ce cours de cette
manière.
Cependant, dans le chapitre précédent, nous vous avons encouragé à configurer votre
environnement de développement local. Il serait donc bon de vous montrer comment
exécuter ce même exemple dans un tel environnement. Cela nécessitera toutefois une
introduction un peu plus longue.
1.3.3 Environnement de développement local
Le JavaScript côté client est un langage du web, et il n’existe qu’à l’intérieur de l’écosystème
web. Dans ce contexte, JavaScript ne peut pas exister tout seul. Le code JavaScript doit être
intégré dans un document HTML.
Lorsque nous avons utilisé l’environnement en ligne pour exécuter notre programme,
certains aspects étaient cachés. Cette fois, nous allons devoir les examiner de plus près.
HyperText Markup Language, ou HTML en abrégé, est un ensemble de balises utilisées pour
décrire la structure d’un site web. Il permet de donner à une page le format d’un document
contenant des sections, des en-têtes, des paragraphes, des listes, etc.
L’HTML est clairement au-delà du cadre de ce cours, donc nous ne présenterons que
quelques notions de base, juste assez pour comprendre où et comment exécuter du code
JavaScript associé à une page donnée.
la balise pour un titre de premier niveau (le plus grand) est <h1>.
Le nom de la balise doit être placé entre crochets angulaires. Les balises sont généralement
utilisées par paires, délimitant une certaine zone du document (on a une balise ouvrante et
une balise fermante). La balise fermante est différente de la balise ouvrante, car un slash
précède le nom.
Souvent, les balises peuvent (et parfois doivent) être placées à l’intérieur d’autres balises. Par
exemple, notre paragraphe devrait être placé à l’intérieur des balises <body>, qui délimitent
la partie principale du document.
<body>
</body>
<!DOCTYPE html>
<html>
<head>
<title>Page vide</title>
</head>
<body>
</body>
</html>
La déclaration <!DOCTYPE html> n’est pas une balise classique : elle indique
simplement au navigateur que le document est conforme au standard HTML5.
Après <head>, nous avons <body>, qui contient tout le contenu visible de la page
web.
Le code JavaScript à exécuter par le navigateur doit être attaché à la page HTML via la balise
<script>.
Il existe deux manières de le faire :
2. Utiliser l’attribut src pour pointer vers un fichier séparé contenant le code JavaScript.
o Pratique lorsque le même code doit être utilisé sur plusieurs pages.
⚡ Les balises <script> sont exécutées par le navigateur au moment où elles sont rencontrées
lors du traitement du document (analyse syntaxique).
Elles se trouvent généralement dans la partie <head> de la page, mais on peut en placer
plusieurs dans un fichier.
Pour les scripts externes (src="..."), on peut utiliser les attributs :
Le CSS (Cascading Style Sheets) est un langage utilisé avec HTML pour décrire l’apparence
d’une page et de ses éléments.
Exemple :
En résumé :
HTML = structure
CSS = style
JavaScript = interaction/dynamique
⚠️Il n’y a pas de page sans HTML. Mais on peut créer une page sans CSS (elle sera juste «
brute »).
Exemple : imaginons que l’utilisateur ouvre son navigateur et tape https://test.org (adresse
fictive).
👉 Si ce fichier contient un bloc <script> ... </script>, le code JavaScript sera exécuté
automatiquement.
Ainsi, notre code console.log("Hello, World!"); sera affiché dans la console, si les outils
développeurs sont activés.
De la même façon, le script peut être placé dans un fichier externe main.js, référencé par
<script src="main.js"></script>.
On peut aussi :
<!DOCTYPE html>
<html>
<head>
<title>Page vide</title>
<script src="main.js"></script>
</head>
<body>
</body>
</html>
console.log("Hello, World!");
Une autre option, très pratique, est d’exécuter directement du JavaScript dans la console du
navigateur.
Tapez :
console.log("Hello, World!");
Mais il est aussi important de tester dans un environnement local (réaliste, proche du
travail d’un développeur web).
Pour de petits tests, on peut utiliser uniquement la console avec une page vide.
Pour des scripts plus grands, il vaut mieux créer un fichier HTML qui référence un
fichier JavaScript via <script>.
4. Essayez :
o en un seul argument
8. Ajoutez les espaces nécessaires pour obtenir le même résultat qu’à la question 4.
2.0.1 Variables
La possibilité d’écrire diverses informations à l’écran, comme « Hello, World! », peut être
amusante pendant un moment, mais ce n’est pas une manière universelle d’écrire des
programmes. Il est temps de commencer à apprendre davantage sur les éléments du puzzle
qui vous permettront, au final, de créer des programmes capables de résoudre de vrais
problèmes.
Au début, cela peut sembler un peu accablant, mais avec le temps, tout devrait commencer à
s’assembler en une image cohérente.
Le premier élément de programmation dont nous allons parler est la variable. Vous
connaissez peut-être ce terme grâce aux mathématiques, où il désigne un symbole servant
de substitut à différentes valeurs susceptibles de changer. Elles ont un rôle similaire en
programmation.
Imaginez les variables comme des conteneurs dans lesquels vous pouvez stocker certaines
informations (ces informations seront appelées valeurs de variable). Chaque conteneur doit
avoir son propre nom, qui nous permettra de le désigner clairement.
En général, nous avons une grande liberté dans le choix de ces noms, mais souvenez-vous
qu’ils devraient avoir un rapport avec ce que nous stockons dans la variable (par ex. height,
color, stepCounter, etc.). Bien sûr, JavaScript ne vérifiera pas la cohérence entre le nom et le
contenu de la variable – il s’agit simplement d’une bonne pratique parmi d’autres, facilitant la
compréhension du code par nous-mêmes et par les autres.
Dans la plupart des langages de programmation, une variable doit être déclarée avant d’être
utilisée, et JavaScript ne fait pas exception. Déclarer une variable revient simplement à «
réserver » son nom. Ainsi, nous informons le programme que, dans la suite de son exécution,
nous allons utiliser ce nom pour accéder à notre conteneur, afin d’en extraire une valeur ou
d’en enregistrer une nouvelle.
En JavaScript, les noms de variables peuvent être constitués de n’importe quelle séquence
de lettres (majuscules et minuscules), de chiffres, de caractères de soulignement (_) et de
signes dollar ($), mais ils ne doivent pas commencer par un chiffre. Il existe aussi une liste de
mots réservés qui ne peuvent pas être utilisés comme noms de variables (voir tableau ci-
dessous).
Un autre point important : l’interpréteur JavaScript distingue les majuscules des minuscules,
même pour les noms de variables. Ainsi, test, Test et TEST seront considérés comme trois
variables différentes.
var height;
Cependant, var est aujourd’hui considéré comme obsolète car il présente des
comportements imprévisibles dans certains cas.
À sa place, nous utilisons let et const, introduits avec ECMAScript 6 (ES6).
let age;
const pi = 3.14159;
Déclarer une variable seule n’a pas beaucoup de sens. Il faut souvent lui attribuer une valeur
initiale.
Avec let, nous pouvons réassigner une nouvelle valeur plus tard :
let counter = 1;
counter = 2; // réassignation
Booléen (true/false) :
Tableau (array) :
Null et undefined :
Avec let et const, les variables sont limitées au bloc où elles sont déclarées :
if (true) {
let x = 10;
console.log(x); // 10
Avec var, elles ont une portée fonctionnelle, ce qui cause parfois des bugs.
Locale : déclarée à l’intérieur d’une fonction ou d’un bloc, accessible uniquement là.
function test() {
console.log(globalVar); // OK
console.log(localVar); // OK
console.log(globalVar); // OK
console.log(localVar); // ❌ Erreur
2.0.10 Constantes et immuabilité
Attention : une constante (const) empêche la réaffectation, mais si la valeur est un objet, ses
propriétés peuvent changer.
Number("42"); // 42
String(42); // "42"
Boolean(0); // false
2.0.12 Résumé
Les programmes sont destinés à traiter des données. Qu’il s’agisse d’une application de
boutique en ligne, d’un système de gestion des ressources humaines ou d’un jeu vidéo,
chacun de ces programmes lit, traite et stocke d’énormes quantités de données. Dans le
chapitre précédent, nous avons déjà appris à déclarer, initialiser et modifier les variables qui
permettent de stocker ces données dans le contexte d’un programme en cours d’exécution.
En parlant des variables, le concept de types de données est apparu, et il s’est avéré que le
langage JavaScript est faiblement typé, ce qui permet, entre autres, de changer le type de
données stockées dans une variable.
Nous pouvons diviser les données selon leurs propriétés. Par exemple, vous distinguerez
certainement de manière intuitive les données numériques des données textuelles. Une telle
classification est bien sûr arbitraire. Les nombres peuvent eux-mêmes être divisés en
nombres entiers et en nombres réels.
La distinction des données par types est l’une des caractéristiques de tout langage de
programmation. Chaque type de données est associé à certaines opérations que l’on peut
exécuter sur lui. Habituellement, il existe également des méthodes de conversion des
données entre certains types (par exemple, un nombre peut être converti pour être
enregistré sous forme de chaîne de caractères).
En JavaScript, les types de données sont divisés en primitifs (ou simples) et complexes (ou
composites). Parmi les types primitifs, on trouve les nombres et les chaînes de caractères,
tandis que parmi les types complexes, on compte par exemple les tableaux et les objets.
La différence entre ces types de données est assez bien résumée par leurs noms. Les types
primitifs ne sont pas complexes : si vous stockez une donnée primitive dans une variable, une
seule valeur y sera enregistrée. Cette valeur sera atomique, autrement dit, il ne sera pas
possible d’en extraire des composants. En revanche, les données de types complexes,
comme un tableau, seront composées de plusieurs éléments de types primitifs.
Avant de passer à la discussion sur les types de données, nous devons introduire un nouveau
concept : les littéraux.
Les littéraux sont une manière de noter des valeurs spécifiques (données) dans le code du
programme. Les littéraux existent dans pratiquement tous les langages de programmation, y
compris JavaScript. Nous avons déjà utilisé des littéraux dans le chapitre précédent lors de
l’initialisation des variables.
Exemple :
Dans cet exemple, nous déclarons la variable year et nous l’initialisons immédiatement avec
la valeur 1990. Les chiffres 1990, écrits directement dans le code à l’endroit de l’initialisation,
sont un littéral représentant un nombre. La valeur 1990 est affichée dans la console via la
variable year. Ensuite, nous affichons 1991 et "Alice" directement dans la console, en
utilisant là encore des littéraux (un nombre et une chaîne de caractères respectivement).
En JavaScript, presque chaque type de données a son propre littéral.
Lors de l’étude des types de données en JavaScript, l’opérateur typeof peut être utile. En
réalité, il l’est aussi dans le travail quotidien avec ce langage, donc il est bon de le retenir
pour plus tard. Nous consacrerons un chapitre entier aux opérateurs, mais pour l’instant il
suffit de savoir qu’un opérateur est un symbole ou un mot qui représente une action à
effectuer sur un ou plusieurs arguments. Par exemple, le symbole + est un opérateur à deux
arguments représentant l’addition.
L’opérateur typeof mentionné est unaire (il ne prend qu’un seul argument) et nous informe
sur le type de la donnée fournie. L’argument peut être un littéral ou une variable – dans ce
dernier cas, typeof indiquera le type de la donnée stockée. Cet opérateur retourne une
chaîne de caractères correspondant à l’un des types prédéfinis.
"undefined"
"object"
"boolean"
"number"
"bigint"
"string"
"symbol"
"function"
Cette liste nous montre les principaux types de données avec lesquels nous travaillerons en
JavaScript.
Exemple :
Comme vous pouvez le voir, typeof appliqué au littéral 1991 ou à la variable year initialisée
avec 1990 retourne "number".
Le même test appliqué aux chaînes "Alice" et "Bob" retourne "string".
Ensuite, nous stockons le résultat de typeof year dans une variable typeOfYear. Cette variable
contient la chaîne "number". Si nous vérifions le type de typeOfYear, nous obtenons "string".
En JavaScript, il existe six types de données primitifs (ou simples) : Boolean, Number, BigInt,
String, Symbol, et undefined. De plus, la valeur primitive null est également considérée
comme un type distinct.
Comme nous l’avons déjà dit, un type primitif est un type de données dont les valeurs sont
atomiques, c’est-à-dire qu’elles représentent un élément unique et indivisible.
Boolean
Le type Boolean est un type logique. Il ne peut prendre qu’une des deux valeurs : true ou
false. Il est principalement utilisé pour les expressions conditionnelles, nécessaires pour
décider quelle partie du code doit être exécutée ou combien de fois une action doit être
répétée (on appelle cela une instruction de contrôle de flux, que nous verrons en détail dans
le Module 4).
Les booleans sont aussi souvent utilisés comme drapeau (flag), une variable qui signale
quelque chose pouvant être présent ou absent, activé ou désactivé, etc. Comme toute
variable, un Boolean doit avoir un nom clair et explicite. Il est courant de préfixer le nom d’un
flag par is pour indiquer qu’il s’agit d’une vérification true/false.
Exemple :
On peut effectuer des opérations logiques sur des valeurs Boolean, sans conversion
préalable. Certaines sont connues en mathématiques : NOT, AND, OR (correspondant aux
symboles !, && et ||). Nous les étudierons plus en détail dans le chapitre sur les opérateurs.
Number
C’est le type numérique principal en JavaScript, représentant à la fois les nombres réels (par
exemple les fractions) et les entiers. La façon dont ces nombres sont stockés en mémoire
signifie que certaines valeurs peuvent être approximatives (surtout pour les très grands
nombres ou certaines fractions).
Pour garantir la précision des calculs, les entiers en JavaScript sont généralement limités à la
plage de -(2^53 - 1) à (2^53 - 1).
Exemple :
Hexadécimal : 0x…
Octal : 0o…
Binaire : 0b…
Il est également possible d’utiliser la notation exponentielle : par exemple, au lieu de 9000,
on peut écrire 9e3, et au lieu de 0.00123, 123e-5.
Exemple :
console.log(a); // -> 10
console.log(b); // -> 16
console.log(c); // -> 8
console.log(d); // -> 2
let x = 9e3;
let y = 123e-5;
En plus des nombres classiques, JavaScript dispose de trois valeurs spéciales : Infinity, -
Infinity et NaN (Not a Number).
NaN indique qu’une opération arithmétique n’a pas pu être effectuée (l’argument
n’est pas un nombre ou ne peut pas être converti en nombre).
Exemple :
let a = 1 / 0;
let b = -Infinity;
let n = s * 10;
BigInt
Le type BigInt est utilisé moins souvent. Il permet de représenter des entiers de longueur
quasi illimitée. Pour la plupart des opérations numériques normales, le type Number suffit,
mais BigInt est utile pour manipuler de très grands nombres.
Les opérations mathématiques sur BigInt se font comme sur Number, mais la division est
toujours arrondie à l’entier inférieur.
Exemple :
console.log(big2); // -> 1n
⚠️On ne peut pas mélanger BigInt et Number dans une opération arithmétique.
BigInt n’a pas d’équivalent pour Infinity ou NaN. Toute opération impossible provoque une
erreur.
String
Le type String représente une séquence de caractères, formant un texte. Les opérations les
plus courantes incluent : concaténation, extraction de sous-chaîne, et vérification de la
longueur. Les chaînes de caractères sont omniprésentes en programmation, et encore plus
en développement web.
Exemple :
On peut utiliser des guillemets simples ou doubles, ou encore des backticks pour
l’interpolation de chaînes. Pour inclure un guillemet à l’intérieur de la chaîne, on peut utiliser
le caractère d’échappement \.
Exemple :
Les chaînes sont immutables : toute modification crée en réalité une nouvelle chaîne.
console.log(character); // -> k
Exemple :
console.log(str.length); // -> 20
Undefined
Le type undefined n’a qu’une seule valeur : undefined. C’est la valeur par défaut des
variables déclarées mais non initialisées.
let declaredVar;
declaredVar = 5;
declaredVar = undefined;
Le type Symbol est un type primitif complexe et assez peu utilisé. Il n’a pas de littéral et se
crée via un constructeur Symbol(). Chaque symbole est unique, utile pour identifier de
manière unique des propriétés d’objets.
Null
La valeur null est primitive mais son type retourne "object" avec typeof. Elle sert à indiquer
qu’une variable ne contient rien, souvent pour des objets.
let someResource;
someResource = null;
En JavaScript, il est très fréquent de convertir des valeurs d’un type vers un autre, que ce
soit automatiquement (conversion implicite) ou manuellement (conversion explicite).
Comprendre ces conversions est essentiel pour éviter des erreurs logiques.
Conversion implicite
La conversion implicite se produit lorsque JavaScript doit effectuer une opération avec des
valeurs de types différents. Dans ce cas, le moteur tente de convertir automatiquement l’une
des valeurs pour que l’opération soit possible.
Exemples :
// Conversion en string
// Conversion en number
console.log('5' - 1); // -> 4 ('5' devient 5)
⚠️ Attention aux conversions implicites : certaines peuvent produire des résultats contre-
intuitifs :
Conversion explicite
La conversion explicite (ou casting) est réalisée par le programmeur en utilisant des fonctions
natives de JavaScript :
Exemples :
// Conversion en number
// Conversion en string
// Conversion en boolean
0 et -0
null
undefined
NaN
false
Bonnes pratiques
1. Éviter les conversions implicites dans les calculs pour limiter les erreurs.
3. Vérifier les valeurs avant la conversion, notamment pour les chaînes susceptibles de
ne pas contenir un nombre valide.
2.1.5 Opérateurs
Par exemple, l’opérateur + est un opérateur binaire, car il nécessite deux opérandes et
effectue l’addition :
let a = 5;
let b = 3;
Types d’opérateurs
1. Opérateurs arithmétiques
Effectuent des calculs numériques sur les nombres.
+ addition / concaténation 2 + 3 5
- soustraction 5-2 3
* multiplication 4*3 12
/ division 10 / 2 5
% modulo (reste) 10 % 3 1
** puissance 2 ** 3 8
⚠️L’opérateur + est spécial, car il sert aussi à concaténer des chaînes de caractères :
2. Opérateurs de comparaison
Permettent de comparer deux valeurs et retournent un Boolean (true ou false).
Opérateur Description Exemple Résultat
⚠️Astuce : toujours privilégier === et !== pour éviter les conversions implicites de type.
3. Opérateurs logiques
Permettent de combiner ou d’inverser des valeurs Boolean.
` ` OU logique (OR)
4. Opérateurs d’affectation
Servent à assigner des valeurs à une variable.
= a=5 a=5
Opérateur Exemple Équivalent long
+= a += 3 a=a+3
-= a -= 2 a=a-2
*= a *= 4 a=a*4
/= a /= 2 a=a/2
%= a %= 3 a=a%3
let x = 5;
💡 Règle générale :
Pour + : si l’un des opérandes est une string, l’autre sera converti en string.
ou lorsqu’un texte doit être interprété comme nombre pour des calculs.
let nr = 42;
let bl = true;
let un = undefined;
let strUn = String(un);
let n = null;
console.log(Number(42)); // -> 42
console.log(Number("11")); // -> 11
console.log(Number(14n)); // -> 14
console.log(Number(true)); // -> 1
console.log(Number(false)); // -> 0
console.log(Number(null)); // -> 0
Exemple : Conversion vers Boolean
Pour convertir une valeur en BigInt, on doit fournir un Number ou une String représentant
un entier. Les valeurs en notation hexadécimale, octale ou binaire sont également autorisées.
Contrairement aux autres conversions, BigInt génère une erreur si la valeur ne peut pas être
convertie.
console.log(BigInt(true)); // -> 1n
console.log(BigInt(NaN)); // -> Erreur : NaN ne peut pas être converti en BigInt car ce
n’est pas un entier
Prenons un exemple simple (similaire à ce que nous avons vu pour le type String) :
console.log(str2); // -> 41
⚠️En résumé :
Exemple de solution :
// Utilisation de littéraux
let undefLiteral;
console.log(boolLiteral, boolConstruct);
console.log(numLiteral, numConstruct);
console.log(bigLiteral, bigConstruct);
console.log(strLiteral, strConstruct);
console.log(undefLiteral, undefConstruct);
Question 2 :
Affichez toutes les valeurs et tous les types de ces valeurs avec console.log. Essayez d’utiliser
l’interpolation de chaînes pour afficher la valeur et le type en une seule instruction.
Exemple :
Question 3 :
Effectuez une chaîne de conversions : créez un Boolean à partir d’un BigInt, créé à partir d’un
Number, qui lui-même a été créé à partir d’une String.
Commencez avec la valeur "1234". Est-ce possible ?
Exemple :
Question 4 :
Essayez d’additionner deux valeurs du même type et vérifiez le type du résultat. Faites-le
pour tous les types primitifs.
Exemple :
console.log("Hello " + "World", typeof ("Hello " + "World")); // -> "Hello World" [string]
Question 5 :
Essayez d’additionner deux valeurs de types différents et observez les résultats.
Exemple :
console.log(10 + "10", typeof (10 + "10")); // -> "1010" [string]
Question 6 :
Modifiez la ligne suivante pour obtenir le résultat 43 sans retirer les guillemets autour de
"1" :
Solution possible :
console.log(str1); // -> 43
o Les types complexes, comme les Object et les Array, peuvent contenir
plusieurs valeurs et méthodes.
2. Literals
3. Opérateur typeof
Boolean : valeurs falsy (0, NaN, "", null, undefined) → false, le reste →
true.
7. Bonnes pratiques
Nous limiterons la discussion sur les types complexes à seulement deux d’entre eux : les
objets et les tableaux. Malheureusement, même ces types devront être présentés de
manière simplifiée. Cela devrait suffire pour les utiliser dans leur portée de base, mais les
techniques plus avancées qui y sont liées, ainsi que les autres types complexes, seront
introduites uniquement dans les prochaines parties du cours.
Objet
Les objets ont de nombreuses applications en JavaScript. L’une des plus basiques, et en
même temps la seule que nous aborderons maintenant, est de l’utiliser comme une
structure connue en informatique sous le nom d’enregistrement. Un enregistrement est une
collection de champs nommés. Chaque champ a son propre nom (ou clé) et une valeur qui
lui est assignée. Dans le cas des objets JavaScript, ces champs sont généralement appelés
propriétés. Les enregistrements, ou dans notre cas les objets, permettent de stocker
plusieurs valeurs de types différents en un seul endroit. En JavaScript, il existe plusieurs
façons de créer des objets, mais la plus simple et rapide est d’utiliser le literal entre
accolades.
L’objet que nous créons et stockons dans la variable testObj n’est pas particulièrement utile,
car il est… vide. Nous n’avons défini aucun champ, c’est-à-dire aucune paire clé–valeur.
Essayons à nouveau, cette fois en définissant un objet contenant deux champs avec les clés
nr et str.
let testObj = {
nr: 600,
str: "text"
};
Remarquez que nous avons créé des objets avec le même literal, mais en même temps nous
avons créé des propriétés qui sont des paires clé–valeur. Les propriétés sont séparées par des
virgules. Une propriété spécifique (champ) d’un objet peut ensuite être référencée avec la
notation par point. Cette notation nécessite le nom de l’objet (un literal ou le nom d’une
variable contenant l’objet), suivi d’un point, puis du nom du champ (clé).
Supposons que nous collections des informations sur les utilisateurs de notre système. Les
informations sur un utilisateur unique consisteront en son prénom, son nom, son âge et son
adresse email. Essayons d’écrire un code approprié pour deux utilisateurs, sans utiliser
d’objets pour l’instant.
Cela semble fonctionner correctement, mais si l’on y réfléchit bien, nous remarquons deux
inconvénients. Tout d’abord, pour chaque utilisateur, il faudra inventer des noms de variables
séparés pour le nom, l’email, etc. Que se passerait-il si nous décrivions chaque utilisateur un
peu plus précisément ? Ou s’il n’y avait pas seulement deux utilisateurs, mais disons mille ?
Cela deviendrait au minimum inconfortable. Dans une certaine mesure, nous pouvons
organiser cela avec des objets. Le deuxième problème est qu’au stade de l’écriture, nous
devons déjà connaître le nombre exact d’utilisateurs à décrire dans le système. Cela serait
extrêmement limitant dans de vraies applications, et il serait préférable de pouvoir les
ajouter dynamiquement. Nous pourrons également améliorer cela, non pas avec des objets,
mais avec des tableaux (dont nous parlerons bientôt).
let user1 = {
name: "Calvin",
surname: "Hart",
age: 66,
email: "[email protected]"
};
let user2 = {
name: "Mateus",
surname: "Pinto",
age: 21,
email: "[email protected]"
};
Nous devons toujours donner des noms différents aux variables qui stockent les informations
(sous forme d’objets) sur les utilisateurs individuels, mais cette fois, les propriétés peuvent
avoir les mêmes noms. Cela rend le code non seulement plus clair et plus cohérent, mais
facilite également les opérations sur les propriétés des différents utilisateurs.
Les propriétés d’un objet, comme nous l’avons indiqué précédemment, sont accessibles avec
un point et le nom de la clé. Nous pouvons à la fois lire et modifier la valeur associée à une
clé particulière. De plus, nous pouvons également modifier l’objet entier en ajoutant une
nouvelle propriété auparavant inexistante. Nous faisons cela également avec la notation par
point : si, lors de la modification, l’interpréteur ne trouve pas la clé spécifiée, il la crée.
console.log(user1.age); // -> 66
user1.age = 67;
console.log(user1.age); // -> 67
user2.phone = "904-399-7557";
Si nous pouvons ajouter de nouveaux champs à un objet existant, pouvons-nous aussi les
supprimer ? Bien sûr : l’opérateur delete est utilisé pour cela.
delete user2.phone;
Tableau (Array)
Un tableau, comme un objet, est un type de données complexe qui peut être utilisé pour
stocker une collection de données. À l’instar des objets, les données stockées (les valeurs)
peuvent être de n’importe quel type. La différence est que dans un tableau, nous ne
stockons que des valeurs, sans les noms associés (c’est-à-dire les clés).
Comment savons-nous à quel élément du tableau nous faisons référence si nous ne pouvons
pas utiliser de nom ? Nous le savons car les éléments du tableau sont ordonnés et occupent
des positions consécutives et numérotées à l’intérieur du tableau. Le numéro du champ où
se trouve une valeur particulière est appelé index ou position. L’index commence à 0.
La manière la plus simple de créer des tableaux en JavaScript est d’utiliser des crochets
(literal de tableau). Cela permet de créer un tableau vide, dans lequel les éléments seront
insérés plus tard, ou un tableau contenant des éléments initiaux (séparés par des virgules).
Pour accéder à un élément du tableau, nous utilisons la notation par crochets, en écrivant
après le nom de la variable le numéro de l’index entre crochets.
Exemple :
days[0] = "Sunday";
Nous avons déclaré et initialisé un tableau days contenant les sept abréviations des jours de
la semaine. Les éléments sont de type String. En gardant à l’esprit que les index commencent
à 0, nous affichons trois jours choisis. Ensuite, nous changeons l’élément à l’index 0,
remplaçant "Sun" par "Sunday". Enfin, nous déclarons un tableau vide et essayons de lire un
élément inexistant.
Comment ajouter un nouvel élément à un tableau existant, par exemple un tableau vide ?
La manière la plus simple est d’assigner une nouvelle valeur à une position spécifique :
animals[0] = "dog";
animals[2] = "cat";
Ici, nous avons placé "dog" à l’index 0 et "cat" à l’index 2, laissant l’index 1 vide. Ce n’est pas
la seule manière d’ajouter des éléments, d’autres méthodes seront présentées plus tard.
En général, on stocke le même type de données dans un tableau, mais JavaScript n’impose
pas cette restriction. Nous pouvons donc créer des tableaux contenant des éléments de
types différents :
Un élément peut aussi être un tableau, ce qui permet de créer des tableaux imbriqués :
Les tableaux sont avant tout une manière pratique de stocker une collection d’éléments sous
un même nom. Il est également important de pouvoir ajouter de nouveaux éléments
pendant l’exécution du programme.
Reprenons l’exemple des utilisateurs du système que nous avons testé avec des objets.
L’inconvénient était de devoir déclarer des variables pour chaque utilisateur. Avec un
tableau, nous pouvons ajouter de nouveaux utilisateurs dynamiquement, même pendant
l’exécution du programme.
let users = [
];
console.log(users[1].age); // -> 21
users[2] = {
};
console.log(names.length); // -> 4
names[5] = "Amelia";
console.log(names.length); // -> 6
console.log(names.indexOf("Mateo")); // -> 2
console.log(names.indexOf("Victor")); // -> -1
names.push("Amelia");
names.unshift("Sophia");
names.reverse();
let n1 = names.slice(2);
let n2 = names.slice(1,3);
let n3 = names.slice(0,-1);
let n4 = names.slice(-1);
2.2.3 PRATIQUE
Objets
1. Créer un objet décrivant un billet de train avec trois champs : from, to, price. Afficher
ses valeurs dans la console.
2. Déclarer un objet vide et ajouter name et surname avec la notation par point.
Afficher les champs.
Tableaux
3. Créer un tableau de trois objets représentant des livres avec title, author, pages.
5. Copier les deux derniers livres dans un nouveau tableau avec slice.
2.2.4 RÉSUMÉ
Les types simples (Number, BigInt, Boolean, String) ne posent pas de problème.
Les types complexes (objet et tableau) ont été présentés de manière simplifiée,
utilisables comme enregistrements ou collections d’éléments.
Les tableaux sont essentiels et seront réutilisés lors des boucles et fonctions.
Objectifs :
Se familiariser avec les propriétés de base des types complexes (Array et Object) et savoir les
utiliser.
Scénario :
Créer une liste de contacts sous forme de tableau, chaque élément étant un objet
représentant un utilisateur avec name, phone, email. Ajouter un nouveau contact en utilisant
la méthode appropriée. Afficher le premier et le dernier contact avec les informations
formatées correctement, en utilisant length pour l’index du dernier élément.
2.3 Section 4 – Commentaires
2.3.1 Commentaires
Les commentaires sont courants en programmation. « Commenter » n’est peut-être pas une
technique de programmation clé (si l’on peut appeler cela une technique), mais cela permet
d’améliorer le travail sur le code, notamment en le rendant plus lisible. Alors, que sont les
commentaires et pourquoi en avons-nous besoin ?
Les commentaires sont simplement du texte brut, totalement ignoré par l’interpréteur
JavaScript, qui sert généralement à expliquer un morceau de code qui, pour certaines
raisons, peut ne pas être totalement clair. Cependant, nous ne pouvons pas les écrire
complètement librement, car l’interpréteur tenterait de les traiter comme des commandes,
des noms de variables ou des mots-clés. JavaScript doit donc pouvoir distinguer les
commentaires du reste du code. En JavaScript, nous avons deux types de commentaires, et
les deux sont couramment utilisés dans de nombreux langages de programmation, de la
famille du langage C à Python. Ils sont appelés commentaires sur une seule ligne et
commentaires multi-lignes.
let x = 42; // Ceci est aussi un commentaire sur une seule ligne, même si la partie avant les
doubles barres est du code correct et sera exécutée
// x = 8;
console.log(x); // -> 42
Dans la plupart des éditeurs de code modernes, il est possible de « commenter » des
fragments de code sélectionnés en utilisant des raccourcis clavier. Cela signifie que nous
pouvons placer le curseur sur la ligne de code sélectionnée et, en appuyant sur une
combinaison de touches spécifique, placer un caractère de commentaire au début de la
ligne. En appuyant à nouveau sur la même combinaison, nous pouvons « décommenter » le
caractère de commentaire. Il est généralement également possible de marquer plusieurs
lignes (avec la souris, ou en utilisant les touches fléchées avec la touche Shift enfoncée) et de
placer un caractère de commentaire au début de toutes les lignes marquées en utilisant la
même combinaison. Ce mécanisme est pris en charge par des applications comme Sublime
Text ou Visual Studio Code, deux éditeurs que nous avons recommandés précédemment.
Essayez-le dans l’éditeur de la plateforme OpenEDG que vous utilisez actuellement. La
combinaison de touches dont nous parlons est la plus courante sous Windows :
(le texte original mentionnait les combinaisons spécifiques mais elles ne sont pas fournies ici)
et sous macOS :
(idem)
Cette méthode est le plus souvent utilisée pour « commenter » (c’est-à-dire désactiver
temporairement) un morceau de code sélectionné, par exemple pour tester une version
alternative.
Commentaires multi-lignes
Les commentaires multi-lignes, également appelés commentaires bloc, permettent de
commenter sur plusieurs lignes, mais également d’insérer des commentaires à l’intérieur
d’une ligne, ce qui n’est pas possible avec les commentaires sur une seule ligne. Ils sont créés
avec une barre oblique et un astérisque au début du commentaire et un astérisque et une
barre oblique à la fin.
/*
console.log("Hello, World!");
*/
console.log(x);
Comme nous l’avons déjà indiqué, il est très important de donner des noms appropriés et
informatifs aux variables (et aussi aux fonctions et tout autre élément que nous pouvons
nommer), mais même les meilleurs noms ne seront pas suffisants si le code est complexe. Et
le code devient complexe assez facilement. Pour aider les développeurs à exprimer leur
intention pour un morceau de code donné, ils utilisent donc des commentaires pour
expliquer verbalement.
Ces exemples sont bien sûr exagérés juste pour montrer comment les utiliser. Dans les
applications et scripts réels, les commentaires doivent être utilisés judicieusement, car trop
de commentaires évidents rendent le code encore plus difficile à lire.
En règle générale, les commentaires doivent être utilisés lorsque la lecture du code n’est pas
suffisante pour comprendre ce qu’il fait, ou dans les situations où le code se comporte
différemment de ce à quoi on s’attend et il faut montrer que c’est intentionnel. Vous devez
également vous rappeler que dans la plupart des projets commerciaux, vous n’êtes pas la
seule personne à lire ce code. Et même si vous l’étiez, relire son propre code après quelques
mois est déjà un défi, et lire le code de quelqu’un d’autre peut rendre le défi encore plus
grand.
angle = angle + 90; // rotation de 90 degrés pour compenser l’écran vertical - BON
let result = a / b;
let result = a / b;
let result = a / b;
Documentation
Nous pouvons utiliser les commentaires pour documenter le code, et écrire exactement ce
que font les fonctions et quels paramètres elles nécessitent. Dans de nombreux projets, les
fichiers ont un en-tête contenant des informations sur l’auteur, la licence ou l’historique des
modifications. Il existe des outils qui peuvent générer automatiquement de la
documentation à partir des commentaires, tant qu’ils sont utilisés selon la référence de
l’outil. Un exemple d’un tel outil est JSDoc. Placer des commentaires dans le code selon le
format de cet outil permettra de générer un site web contenant des informations détaillées
sur un projet (par ex. descriptions des fonctions, paramètres, valeurs retournées, etc.).
Activation/Désactivation de code
Parfois, nous avons un fragment de code qui pose problème, ou nous voulons tester
rapidement quelques options. Commenter du code est un excellent outil pour cela.
Nous pouvons désactiver chaque ligne de code en utilisant des commentaires sur une seule
ligne comme dans l’exemple. Avec des commentaires bloc, nous pouvons commenter de
grands fragments de code ou des fonctions entières. Cela est très utile pour identifier les
problèmes dans le code.
Pour l’instant, l’utilisation des commentaires peut sembler n’être qu’une curiosité.
Cependant, rappelez-vous qu’avec le temps, vous commencerez à écrire des programmes de
plus en plus complexes. Ils seront composés de nombreux fichiers, avec des centaines ou des
milliers de lignes de code. Les commentaires permettent d’augmenter la clarté du code en
ajoutant des informations qui aideront les autres à comprendre certaines parties. L’étape
suivante sera la capacité à générer la documentation du projet à partir de ces commentaires,
bien que pour cela vous devrez adapter vos commentaires à la convention imposée par l’outil
choisi. Les commentaires sont également très utiles pour activer ou désactiver des morceaux
de code sélectionnés, ce que nous utilisons le plus souvent lors de tests de versions
alternatives ou lors de la recherche d’erreurs.
"use strict";
let prefixedUserName;
const prefixedUserName;
userName = "John";
console.log(prefixedUserName + prefixedUserName2);
console.log(prefixedUserName2);
3.0 Section 1 – Opérateurs d’assignation, arithmétiques et logiques
3.0.1 Opérateurs
Les opérateurs dans les langages de programmation sont des symboles (parfois aussi des
noms) utilisés pour effectuer certaines actions sur des arguments appelés opérandes.
Les opérandes peuvent être des valeurs ou des variables. Nous avons rencontré des
opérateurs à plusieurs reprises dans les exemples précédents, par exemple le symbole
d’assignation = ou le mot-clé typeof.
Les opérateurs peuvent être catégorisés de plusieurs façons. Ils se distinguent, par exemple,
selon le nombre d’opérandes sur lesquels ils agissent.
L’opérateur d’addition + est un opérateur binaire typique (il utilise deux opérandes), tandis
que l’opérateur typeof est un opérateur unaire (il utilise un seul opérande).
En JavaScript, il existe également un opérateur ternaire (qui agit sur trois opérandes), dont
nous parlerons un peu plus loin.
Nous pouvons distinguer les opérateurs préfixes (placés avant l’opérande), postfixes (après
l’opérande) et infixes (entre les opérandes). Cependant, il est courant de classer les
opérateurs selon le contexte dans lequel ils sont utilisés : nous avons ainsi les opérateurs
d’assignation, arithmétiques, logiques ou conditionnels. Nous passerons en revue les
opérateurs de base de JavaScript selon cette classification.
Un même symbole peut être interprété comme un opérateur différent selon le contexte, le
plus souvent en fonction du type d’opérandes. En JavaScript, le symbole + en est un exemple.
Si les opérandes sont des nombres, l’utilisation de cet opérateur entraînera le calcul de leur
somme (il s’agit d’un opérateur d’addition, classé comme arithmétique). Cependant, si les
opérandes sont des chaînes de caractères, le même symbole sera traité comme un opérateur
de concaténation, et l’interpréteur tentera de joindre les deux chaînes.
Commençons par les opérateurs d’assignation. Dans ce groupe, on trouve des opérateurs qui
permettent d’assigner des valeurs à des variables et des constantes. L’opérateur d’assignation
de base est le signe égal =, que nous avons déjà vu plusieurs fois dans les exemples. Cet
opérateur assigne la valeur de l’opérande de droite à l’opérande de gauche.
year = 2051;
L’opérateur d’addition convertira tout en String si l’un des opérandes est de type String, sinon
il les convertira en Number comme les autres opérateurs arithmétiques. L’ordre des
opérations est respecté en JavaScript comme en mathématiques, et nous pouvons utiliser
des parenthèses pour modifier l’ordre si nécessaire.
const x = 5;
const y = 2;
Les deux convertissent les opérandes en type Number, tandis que l’opérateur - les inverse
également.
let n1 = +str;
let n2 = -str;
let n3 = -n2;
let n4 = +"abcd";
Parmi les opérateurs arithmétiques, nous avons également à disposition les opérateurs
d’incrémentation ++ et de décrémentation --, en version préfixe et postfixe. Ils permettent
d’augmenter ou de diminuer la valeur de l’opérande de 1.
Exemple :
Note : le type Number est flottant, ce qui peut entraîner des imprécisions sur certaines
opérations :
Les opérateurs arithmétiques binaires peuvent être combinés avec l’opérateur d’assignation,
donnant : +=, -=, *=, /=, %=, **=.
Exemple :
let x = 10;
x += 2; // x = x + 2
x -= 4; // x = x - 4
x *= 3; // x = x * 3
x /= 6; // x = x / 6
x **= 3; // x = x ** 3
x %= 10; // x = x % 10
Les opérateurs logiques travaillent avec des valeurs booléennes (true ou false). JavaScript
propose :
OR logique : ||
NOT logique : !
Exemple :
Évaluation courte : si le premier opérande suffit à déterminer le résultat, le second n’est pas
évalué.
let x = 0, y = 0;
console.log(x); // -> 1
console.log(y); // -> 0
Comme les opérateurs arithmétiques, les opérateurs logiques peuvent être combinés avec
l’assignation :
let a = true;
let b = false;
Opérateurs arithmétiques
Remplir les opérateurs manquants pour obtenir le résultat attendu :
Opérateurs de comparaison
Remplir les opérateurs pour que toutes les expressions soient vraies :
console.log(4 * 5 _ 20);
console.log(6 * 5 _ "30");
console.log(-17 _ 0);
console.log(25 _ 1);
console.log(2 + 2 * 2 _ 4);
Opérateurs logiques
Remplir les opérateurs pour que toutes les expressions soient vraies :
console.log(true _ false);
console.log(false _ false);
Le seul opérateur dans ce groupe est la concaténation +. Cet opérateur convertira tout en
chaîne de caractères si l’un des opérandes est de type String. Enfin, il créera une nouvelle
chaîne de caractères en attachant l’opérande de droite à la fin de l’opérande de gauche.
sentence += 10191;
Les opérateurs de comparaison servent à vérifier l’égalité ou l’inégalité de valeurs. Tous les
opérateurs de comparaison sont binaires et renvoient tous une valeur logique représentant
le résultat de la comparaison, true ou false.
Comme pour les autres opérateurs, JavaScript tentera de convertir les valeurs comparées si
elles sont de types différents. Il est logique de vérifier l’égalité ou la supériorité en utilisant la
représentation numérique, et JavaScript convertira dans la plupart des cas les types en
Number avant la comparaison. Il existe deux exceptions : les chaînes de caractères et
l’opérateur d’identité (égalité stricte). Les chaînes sont comparées caractère par caractère
(précisément caractère Unicode par caractère Unicode selon leurs valeurs).
Pour vérifier si les opérandes sont égaux, on peut utiliser soit l’opérateur d’identité (égalité
stricte) ===, soit l’opérateur d’égalité ==.
Le premier est plus restrictif : pour retourner true, les opérandes doivent être identiques
(c’est-à-dire égaux et du même type).
L’opérateur d’égalité exige seulement que les valeurs soient égales, les types ne sont pas
comparés. Donc si les opérandes sont de types différents, l’interpréteur tentera de les
convertir en nombres : false devient 0, true devient 1, undefined devient NaN, null devient 0,
10n devient 10, "123" devient 123, etc.
Notez que si l’un des opérandes a une valeur NaN (ou a été converti en NaN, par exemple
avec undefined), l’opérateur d’égalité renverra false.
Rappel : utilisez l’opérateur d’identité sauf si vous voulez intentionnellement autoriser une
comparaison positive entre différents types.
On dispose aussi d’opérateurs permettant de vérifier si un opérande est supérieur >, inférieur
<, supérieur ou égal >= et inférieur ou égal <=. Ces opérateurs fonctionnent sur tout type
d’opérande, mais il est logique de les utiliser uniquement sur des nombres ou des valeurs
convertibles en nombres.
Vous pouvez également les utiliser pour comparer des chaînes ne représentant pas des
nombres, mais l’algorithme est complexe et la comparaison peu utile. Par simplification, les
caractères des deux chaînes sont testés aux mêmes positions. On suppose que la valeur des
caractères correspond à leur position dans l’alphabet (la lettre b a une valeur supérieure à a).
Les majuscules ont des valeurs inférieures aux minuscules, et les chiffres ont des valeurs
encore plus faibles.
Remarque : le symbole => existe en JavaScript, mais ce n’est pas un opérateur – il est utilisé
pour construire des fonctions fléchées.
La liste des opérateurs en JavaScript est bien plus longue, mais beaucoup ne seraient pas
particulièrement utiles à ce stade, comme les opérateurs bit à bit, qui travaillent sur des bits
individuels des opérandes. Cependant, il convient de mentionner quelques opérateurs
supplémentaires, dont certains sont déjà apparus dans les exemples précédents.
typeof
Nous avons déjà présenté l’opérateur typeof lors de la discussion sur les types de données.
C’est un opérateur unaire qui vérifie le type d’un opérande (variable ou littéral). Il renvoie
une chaîne avec le nom du type, comme "boolean" ou "number".
Dans ce cours, son utilité est limitée à tester si une variable contient un tableau.
delete
L’opérateur unaire delete a été présenté lors de la discussion sur les objets. Il permet de
supprimer un champ sélectionné de l’objet dont le nom est indiqué comme opérande.
let user = {
name: "Alice",
age: 38
};
console.log(user.age); // -> 38
delete user.age;
Opérateur ternaire
Le dernier opérateur discuté est assez inhabituel car c’est le seul opérateur utilisant trois
opérandes. C’est un opérateur conditionnel. Selon la valeur du premier opérande (true ou
false), la valeur du deuxième ou du troisième opérande est retournée. Il est le plus souvent
utilisé pour attribuer l’une des deux valeurs à une variable selon une condition. Les trois
opérandes sont séparés par ? (premier et deuxième) et : (deuxième et troisième).
Chacun des opérandes peut être une expression à calculer. Dans l’exemple suivant, le
premier opérande est une comparaison de deux nombres. Le résultat de la comparaison sera
false, utilisé par l’opérateur ternaire.
Dans pratiquement tous les exemples précédents, nous avons présenté l’opération de
plusieurs opérateurs en suivant des instructions où un seul opérateur était utilisé. En réalité,
plusieurs opérateurs sont généralement utilisés simultanément. Une question importante se
pose : dans quel ordre l’interpréteur les exécutera-t-il ? Cela affectera le résultat final, donc il
est important d’en tenir compte lors de l’écriture du code.
let a = 10;
let b = a + 2 * 3;
console.log(a); // -> 10
console.log(b); // -> 16
Dans la deuxième ligne (déclaration de b), les opérateurs sont exécutés selon l’ordre
mathématique : multiplication, puis addition, puis assignation. Dans la troisième ligne (c), le
calcul est plus complexe : somme de a + 2, puis 20 - 15, puis comparaison avec < et
assignation à c.
let a, b;
console.log(a); // -> 60
Il est normal que la quantité d’informations nouvelles, notamment sur la précédence, semble
intimidante. Peu de programmeurs JavaScript seraient capables de définir correctement tous
les opérateurs selon leurs priorités.
Heureusement, nous avons les parenthèses pour forcer la priorité des opérations. Les
opérateurs apparaîtront dans tous les exemples jusqu’à la fin du cours, permettant de
consolider progressivement vos connaissances en un ensemble logique et cohérent.
3.2 Section 3 – Interaction avec l’utilisateur
La plupart des programmes que nous utilisons au quotidien dépendent de l’interaction avec
l’utilisateur. L’utilisateur saisit des données, fait des choix et confirme les options proposées
par le programme. Grâce à cette interaction, le programme peut commencer à utiliser les
données fournies par l’utilisateur pendant son exécution (ces données n’étaient pas connues
au moment du démarrage du programme, ni au moment de sa rédaction). De plus, le
programme peut effectuer certaines actions de manière conditionnelle : l’utilisateur
influence non seulement les données, mais aussi l’exécution du programme.
Dans le cas de JavaScript, l’interaction avec l’utilisateur est un sujet assez complexe. Cela
pour plusieurs raisons. Vous vous souvenez que nous pouvons écrire des programmes dans
ce langage à la fois pour une utilisation côté navigateur (client-side) et pour exécuter
certaines actions côté serveur (server-side) ? Cette distinction influence l’interaction
possible. Les programmes JavaScript écrits avec Node.js pour serveur n’exigent généralement
pas ce type d’interaction. On les exécute depuis la console, souvent sans interface graphique.
Le plus souvent, l’utilisateur fournit certaines options (par exemple des chemins de fichiers)
au programme exécuté sous cette forme, via un fichier de configuration et/ou des arguments
d’appel. Les données utilisées pour exécuter le programme sont alors récupérées depuis des
fichiers sur disque, des bases de données, des services réseau, etc. Il est très rare que de tels
programmes console nécessitent la saisie de données pendant leur exécution. Si c’est
nécessaire, cela est indiqué par l’apparition d’un message approprié dans la console, sur
laquelle il faut saisir des données.
C’est très différent pour les applications côté client. La plupart du temps, elles nécessitent
une interaction continue entre l’utilisateur et le programme. Grâce à elles, nous pouvons
cliquer sur des boutons, remplir des formulaires, sélectionner des données dans des listes
déroulantes, etc. Le problème est que pratiquement tous les éléments utilisés à cette fin sont
des composants HTML. Leur utilisation peut ne pas être très difficile, mais elle requiert au
moins une compréhension approfondie des bases du DOM (Document Object Model) utilisé
dans les pages web, ainsi que des bases du HTML lui-même.
Un exemple de page HTML utilisant deux éléments pour l’interaction, manipulés par du code
JavaScript, est présenté ci-dessous :
<!DOCTYPE html>
<html>
<head></head>
<body>
<button onClick="console.log(document.getElementById('myId').value)">Get
Text</button>
</body>
</html>
Exécutez ce code dans l’éditeur, en vous assurant qu’il se trouve dans la fenêtre dédiée au
HTML (onglet index.html). L’élément <input> est un champ de saisie où vous pouvez entrer
du texte. Dans notre cas, nous avons donné à cet élément l’identifiant myId. L’élément
<button> correspond, comme son nom l’indique, à un bouton. Grâce à l’attribut onClick,
nous avons indiqué que si le bouton est cliqué, un morceau de code JavaScript doit être
exécuté. Dans ce code, nous faisons référence à l’objet document (un fragment du modèle
DOM) qui représente notre page web. Nous recherchons l’élément ayant l’identifiant myId,
récupérons sa valeur (c’est-à-dire le texte saisi) et affichons le résultat dans la console.
Comme vous le voyez, l’idée est relativement simple, mais le modèle DOM et le langage
HTML dépassent clairement le cadre du cours actuel. Alors, comment communiquer avec
l’utilisateur si nous n’utilisons pas ces mécanismes standard ?
Il existe une autre solution. Notez qu’elle n’est pas utilisée dans les applications web
modernes, mais elle permet de donner facilement à l’utilisateur la possibilité de saisir des
données ou de prendre certaines décisions. Nous l’utiliserons dans ce cours comme un
substitut pour la communication normale, plutôt que comme un élément pratique pour une
vraie programmation. La solution consiste à utiliser des boîtes de dialogue.
Les boîtes de dialogue font partie intégrante des navigateurs web, et sont disponibles dans
presque tous, même les très anciens. Ce sont toutes des fenêtres popup (ou modales), ce qui
signifie que lorsqu’elles sont affichées, il est impossible d’interagir avec la page web elle-
même tant que la boîte de dialogue n’est pas fermée.
Cette gêne lorsque la fenêtre popup est visible est une des raisons pour lesquelles il ne faut
pas les utiliser de manière excessive. Elles sont parfaitement adaptées pour l’apprentissage
et, dans de rares cas où des informations importantes doivent être affichées, ou qu’une
saisie utilisateur est obligatoire. Trois types de boîtes de dialogue sont disponibles.
alert("Hello, World!");
alert(4 * 7);
alert(true);
Comme console.log, on peut passer n’importe quelle valeur à alert et elle sera convertie en
chaîne. La différence est que console.log accepte plusieurs paramètres, alors que alert n’en
accepte qu’un (ou zéro si optionnel).
La fenêtre alert restera visible tant que l’utilisateur n’aura pas cliqué sur le bouton OK.
L’exécution du code est suspendue tant que la boîte n’est pas fermée.
console.log(decision);
Les valeurs retournées par confirm permettent d’exécuter certaines actions du programme
de manière conditionnelle. Exemple avec l’opérateur conditionnel ternaire :
console.log(message);
Comme les autres, prompt accepte un paramètre optionnel pour le message, et un second
paramètre optionnel pour la valeur par défaut du champ texte. La méthode retourne le texte
saisi si l’utilisateur clique sur OK, ou null si Annuler est cliqué. Comme la valeur retournée est
toujours une chaîne, il est parfois nécessaire de la convertir dans un autre type, par ex. un
nombre. Il faut aussi se préparer à ce que l’utilisateur saisisse des données invalides.
let age = prompt("Hello " + name + " how old are you?");
Les fenêtres de dialogue ne sont pas la manière la plus efficace ni élégante de communiquer
avec un programme, mais elles sont suffisantes pour nos besoins.
Elles permettent de récupérer des données et de tenir compte des décisions de l’utilisateur,
qui peuvent influencer le programme.
L’exécution conditionnelle, ou les instructions de contrôle de flux, ont déjà été mentionnées
à plusieurs reprises, et il est maintenant temps de les examiner en détail. C’est un sujet très
important, car ces instructions sont essentielles non seulement en JavaScript, mais en
programmation en général. Sans la capacité de réagir et de modifier son comportement,
n’importe quel code ferait toujours la même chose. Bien sûr, cela peut parfois correspondre
exactement à ce dont nous avons besoin, mais la plupart du temps, nous avons besoin de
réactivité et de la capacité à gérer différentes situations dans le code.
On peut imaginer notre programme comme un arbre qui commence par le tronc et se divise
progressivement en branches successives. Le tronc représente le début du programme, et
chaque instruction conditionnelle reflète une nouvelle branche. Les instructions
conditionnelles sont exécutées sur la base de la décision de l’utilisateur, des résultats de
calculs précédents ou d’autres informations que le programme prend en compte. JavaScript
fournit plusieurs manières de diriger l’exécution du code en fonction de conditions
arbitraires. À partir de ce chapitre, vous aurez plus de tâches et de code à écrire, car vous
disposez maintenant presque de tous les outils nécessaires.
4.0.2 L’instruction if
if (condition) {
bloc de code
Le mot-clé if doit être suivi de l’expression entre parenthèses, qui sera évaluée en un
booléen. Si le résultat est true, le bloc de code qui suit l’expression conditionnelle est
exécuté. Si l’expression est false, le bloc ne sera pas exécuté. Le bloc de code doit être
délimité par des accolades {}.
console.log(isUserReady);
if (isUserReady) {
alert("User ready!");
Dans cet exemple, l’alerte "User ready!" ne s’affichera que si l’utilisateur ferme la boîte de
confirmation en cliquant sur OK. Si l’utilisateur ferme la boîte sans cliquer sur OK, le message
ne sera jamais affiché.
Même si un seul bloc contient une ligne de code, il est préférable d’utiliser les accolades pour
éviter les erreurs courantes lors de l’ajout de nouvelles instructions à l’intérieur du bloc.
Exemple problématique :
if (isUserReady)
console.log("User ready!");
alert("User ready!");
Les blocs de code servent à créer une unité logique. Les variables et constantes déclarées
avec let ou const à l’intérieur d’un bloc sont locales à ce bloc. Exemple :
let unitPrice = 10;
if (pieces > 0) {
console.log(total);
shippingCost = 0;
console.log(shippingCost);
shippingCost = 0;
if (isUserReady) {
console.log("User ready!");
} else {
if (condition1) {
code
} else if (condition2) {
code
} else if (condition3) {
code
} else {
code
Exemple :
alert("<10");
alert("<30");
alert("<60");
} else if (number < 90) {
alert("<90");
alert("<100");
alert("100");
} else {
alert(">100");
Seule une alerte s’affichera, JavaScript arrête de vérifier après la première condition vraie.
L’opérateur conditionnel (ou ternaire) permet d’exécuter une action parmi deux, selon une
condition :
alert(message);
Pour des expressions longues, il vaut mieux utiliser if pour plus de clarté.
Le switch est une alternative aux if imbriqués. Il évalue une expression et tente de la faire
correspondre à des cas définis :
switch (expression) {
case valeur1:
code;
break;
case valeur2:
code;
break;
default:
code;
Exemple :
switch (gate) {
case "a":
alert("Gate A: empty");
break;
case "b":
win = true;
break;
case "c":
alert("Gate C: empty");
break;
default:
if (win) {
alert("Winner!");
}
4.0.7 Résumé de la section
Les instructions conditionnelles sont essentielles pour presque toute application. Elles
permettent de gérer les entrées utilisateur, les valeurs reçues du web ou les résultats
d’opérations.
La construction la plus universelle reste if ... else, mais l’opérateur conditionnel ou switch
peut être plus pratique dans certains cas.
Rappel : la valeur retournée par prompt est une chaîne. Utiliser Number.isNaN pour vérifier si
la conversion en nombre est correcte.
Scénario :
Lors de la dernière modification du programme de liste de contacts, l’utilisateur pouvait
ajouter un nouveau contact.
Allez plus loin : proposer un menu où l’utilisateur choisit :
Lors de l’ajout d’un nouveau contact, vérifier que toutes les données sont saisies (nom,
téléphone, email). Si une donnée est manquante, ne pas ajouter le contact.
4.1 Section 2 – Boucles
Il existe plusieurs types de boucles en JavaScript, mais on peut grossièrement les classer en
deux catégories :
Nous savons donc que les boucles nous permettent d’exécuter un fragment de code plusieurs
fois. Mais quel serait l’intérêt ?
Imaginons qu’au sein d’un programme, nous avons créé un tableau contenant des
informations sur les utilisateurs du système. Si nous voulions afficher le nom de chacun d’eux
dans la console, nous devrions écrire console.log autant de fois qu’il y a d’utilisateurs. Par
exemple, pour 100 utilisateurs, nous écririons 100 appels console.log les uns en dessous des
autres. Cela semblerait plutôt étrange, n’est-ce pas ?
À la place, nous pouvons utiliser une boucle qui appelle la même commande console.log 100
fois, mais pour chaque élément suivant du tableau. Chaque itération de la boucle fera
référence à l’utilisateur suivant. Dans un instant, nous apprendrons à utiliser différentes
boucles.
Commençons par un exemple sans utiliser de boucle. Notre objectif est d’afficher les
nombres consécutifs 0, 10, 20, 30, 40, 50, 60, 70, 80 et 90 dans la console.
console.log(0); // -> 0
console.log(10); // -> 10
console.log(20); // -> 20
console.log(30); // -> 30
console.log(40); // -> 40
console.log(50); // -> 50
console.log(60); // -> 60
console.log(70); // -> 70
console.log(80); // -> 80
console.log(90); // -> 90
Au final, nous avons atteint notre objectif, mais cela semble un peu étrange. Nous répétons
la même commande dix fois, une par une. À première vue, il peut sembler que les
commandes ne sont pas exactement identiques. Oui, chaque fois nous appelons console.log,
mais à chaque fois un argument différent apparaît : 0, 10, 20, etc.
let n = 0;
console.log(n); // -> 0
n += 10;
console.log(n); // -> 10
n += 10;
console.log(n); // -> 20
n += 10;
console.log(n); // -> 30
n += 10;
console.log(n); // -> 40
n += 10;
console.log(n); // -> 50
n += 10;
console.log(n); // -> 60
n += 10;
console.log(n); // -> 70
n += 10;
console.log(n); // -> 80
n += 10;
console.log(n); // -> 90
n += 10;
Nous utilisons la variable n, que nous initialisons à 0. Ensuite, nous répétons ce fragment de
code identique dix fois : nous affichons la valeur actuelle de n dans la console, puis nous
l’augmentons de 10.
console.log(n);
n += 10;
C’est exactement la situation où nous pouvons utiliser une boucle. En utilisant la boucle
while, nous réécrivons notre code : nous laissons la déclaration et l’initialisation de la
variable n inchangées. Le fragment de code répétitif est placé dans un bloc de code séparé,
et à l’aide du mot while, nous précisons qu’il doit être exécuté tant que la valeur de n est
inférieure à 91.
let n = 0;
console.log(n); // -> 0, 10, 20, 30, 40, 50, 60, 70, 80, 90
n += 10;
La boucle while est si polyvalente qu’une personne persistante pourrait remplacer toutes les
autres instructions de contrôle par des boucles while, même des instructions if. Bien sûr, ce
serait fastidieux au mieux. La boucle while est normalement utilisée lorsque nous ne savons
pas exactement combien de fois quelque chose doit être répété, mais nous savons quand
nous arrêter. La syntaxe de la boucle while est la suivante :
while(condition) {
bloc de code
Bien sûr, avec une condition mal formée, une boucle while peut se transformer en boucle
infinie. Selon le contexte, cela peut être voulu. Presque tous les jeux vidéo sont, par exemple,
essentiellement des boucles infinies répétitives : lire les entrées du joueur, mettre à jour
l’état du jeu, afficher à l’écran autant de fois que nécessaire par seconde. C’est une grande
simplification, mais néanmoins vrai.
Cette fois, la décision de terminer la boucle sera prise par l’utilisateur qui répond à la
question posée à chaque itération (nous utiliserons la boîte de dialogue confirm que nous
avons récemment introduite).
let counter = 1;
counter = counter + 1;
La boucle sera répétée jusqu’à ce que la variable isOver soit définie sur true.
Dans la boucle, nous affichons la question : "Continuer la boucle ?", précédée du numéro de
l’itération (variable counter).
Notez que la variable counter n’est pas utilisée dans la condition while, son rôle est
uniquement informatif. Cliquer sur le bouton OK de la boîte de dialogue confirm affectera
true à continueLoop (sinon, elle sera false).
En fonction de la valeur de continueLoop, nous définissons une nouvelle valeur pour isOver.
N’oubliez pas que la variable testée dans la condition while doit être initialisée au préalable.
C’est l’une des erreurs les plus courantes des débutants : ils se rappellent de changer sa
valeur à l’intérieur de la boucle, mais oublient de la définir pour le premier test.
L’exemple est correct, mais contient beaucoup de code redondant, qui n’est pas vraiment
nécessaire (nous l’avons fait seulement pour analyser le fonctionnement des instructions
ultérieures de manière simple). Le même effet peut être obtenu en simplifiant le code ainsi :
let counter = 1;
while (!isOver) {
}
4.1.3 La boucle do … while
La boucle do ... while est très similaire à la boucle while classique, la principale différence
étant que dans une boucle while, la condition est vérifiée avant chaque itération, alors que
dans do ... while, elle est vérifiée après chaque itération.
Cela peut sembler peu important, mais la conséquence est que le code dans une boucle
do ... while est toujours exécuté au moins une fois avant le premier test de condition, alors
qu’une boucle while classique peut ne jamais être exécutée si la condition initiale est false.
Syntaxe :
do {
bloc de code
} while(condition);
let isOver;
let counter = 1;
do {
} while (!isOver);
Dans l’exemple suivant, nous démontrons ce que nous avons dit plus tôt : une boucle do ...
while s’exécute toujours au moins une fois :
while (condition) {
do {
} while (condition);
4.1.4 La boucle for
La boucle for fait partie du deuxième type de boucles, utile lorsque nous savons combien de
fois la boucle doit être exécutée (mais ce n’est pas obligatoire).
Syntaxe :
bloc de code
Entre parenthèses après for, il y a trois champs séparés par des points-virgules :
Tous ces champs sont optionnels, mais on les utilise presque toujours.
Instruction d’initialisation : exécutée une seule fois avant la première itération. On l’utilise
généralement pour initialiser une variable compteur.
console.log(i);
let i = 0;
console.log(i);
i++;
let sum = 0;
sum += values[i];
Nous pouvons combiner boucles et tableaux pour créer des structures dynamiques.
Exemple : demander à l’utilisateur de saisir des noms jusqu’à ce qu’il appuie sur Annuler.
while (!isOver) {
if (name != null) {
names.push(name);
} else {
isOver = true;
console.log(names[i]);
Nous avons créé et rempli une structure de données dynamique sans savoir à l’avance
combien d’éléments elle contiendrait.
Exemple :
let sum = 0;
sum += number;
Syntaxe :
bloc de code
let user = {
name: "Calvin",
surname: "Hart",
age: 66,
email: "[email protected]"
};
};
if (i == 3) {
continue;
console.log(i);
switch (gate) {
case "a":
case "A":
case 1:
case "1":
alert("Porte A : vide");
break;
case "b":
case "B":
case 2:
case "2":
win = true;
break;
case "c":
case "C":
case 3:
case "3":
alert("Porte C : vide");
break;
default:
if (win) {
alert("Gagnant !");
Pour du code plus complexe, on peut encapsuler chaque cas entre accolades pour créer un
scope local.
Il est difficile d’imaginer écrire des programmes sans boucles. Leur utilisation habile facilite le
travail et permet de créer des solutions impossibles autrement. JavaScript offre de nombreux
mécanismes pour répéter des actions, parcourir des tableaux ou des objets. Les boucles
while et for suffisent généralement à créer des programmes avancés.
let numbers = [21, 45, 100, 12, 11, 78, 61, 4, 39, 22];
Affichez d’abord tous les nombres, puis ceux pairs, puis ceux supérieurs à 10 et inférieurs à
60.
Exercice 4 : Demandez le nom et la note d’un film (IMDb). Permettez l’entrée de plusieurs
films dans un tableau d’objets {title, imdb}. Affichez ensuite les films avec note < 7, puis ≥ 7.
Exercice 6 : Modifiez votre programme calculatrice pour qu’il fonctionne en boucle jusqu’à ce
que l’utilisateur saisisse Q.
Objectifs :
Se familiariser avec :
Scénario :
Améliorez un programme de liste de contacts en utilisant des boucles pour afficher tous les
contacts et répéter le menu d’actions jusqu’à ce que l’utilisateur choisisse de quitter :
Une fonction est un morceau de code indépendant conçu pour effectuer une tâche
spécifique.
On lui donne généralement un nom pour pouvoir l’appeler plusieurs fois dans le
programme.
let sum = 0;
sum += temperatures[i];
console.log(`mean: ${meanTemp}`);
Syntaxe de base :
function functionName() {
// code
Exemple :
function getMeanTemp() {
sum = 0;
Déclarer une fonction ne l’exécute pas. Il faut l’appeler pour voir l’effet.
Exemple complet :
getMeanTemp();
console.log(`mean: ${meanTemp}`);
Les fonctions peuvent être déclarées avant ou après leur appel grâce au hoisting.
Les variables déclarées à l’intérieur d’une fonction (let ou var) sont locales et
invisibles à l’extérieur.
function getMeanTemp() {
sum += temperatures[i];
function getTrue() {
return true;
function getMeanTemp() {
let sum = 0;
sum += temperatures[i];
5.0.6 Paramètres
Les arguments sont les valeurs passées aux paramètres lors de l’appel.
Exemple : addition :
return elements[index];
}
let names = ["Alice", "Bob", "Eve", "John"];
function getMeanTemp(temperatures) {
let sum = 0;
sum += temperatures[i];
console.log(getMeanTemp(day1));
console.log(getMeanTemp(day2));
5.0.7 Shadowing
Les paramètres et variables locales dans une fonction masquent (shadow) les
variables globales du même nom.
function test(a) {
let b = 10;
console.log(a); // paramètre a
Rappelez-vous comment nous avons dit que nous utilisons parfois le mot-clé return pour
interrompre les fonctions en cas d’erreurs ? Un bon exemple est la validation des paramètres
d’une fonction.
function getMeanTemp(temperatures) {
return NaN;
let sum = 0;
sum += temperatures[i];
5.1.2 Récursion
n!=n⋅(n−1)⋅(n−2)⋅...⋅2⋅1n! = n \cdot (n-1) \cdot (n-2) \cdot ... \cdot 2 \cdot 1n!
=n⋅(n−1)⋅(n−2)⋅...⋅2⋅1
let result = 1;
while (n > 1) {
result *= n;
n--;
return result;
Dans ce cas, nous utilisons l’approche itérative pour calculer la factorielle, c’est-à-dire que
nous utilisons une boucle dans laquelle, à chaque itération, nous multiplions le résultat
précédent par un autre élément de la séquence.
Après la première itération, le résultat est 6, après la deuxième, 30, après la troisième, 120,
et ainsi de suite. Les itérations se répètent jusqu’au dernier élément significatif de la
séquence, c’est-à-dire jusqu’à la valeur 2 (d’où la condition de fin de boucle n > 1).
Cependant, la définition d’une factorielle peut être écrite d’une manière légèrement
différente. Elle sera la factorielle de l’élément précédent n - 1 multipliée par n.
Par exemple, 6! est 5! multiplié par 6. Une telle définition de la factorielle utilise la récursion,
c’est-à-dire que la fonction se réfère à elle-même (mais avec un argument différent). La
récursion est un mécanisme qui permet de simplifier la notation formelle de nombreuses
fonctions mathématiques et de les présenter de manière élégante. Nous pouvons également
utiliser la récursion avec succès en programmation.
Pour obtenir un code plus court et plus compact, au lieu d’une instruction conditionnelle if,
nous utilisons l’opérateur conditionnel ternaire. Ici, nous vérifions si l’argument n est
supérieur à 1. Selon le résultat, nous retournons soit le produit du nombre n par le résultat
de l’appel factorial(n – 1), soit la valeur 1. La figure ci-dessous montre une séquence d’appels
à la fonction factorielle à partir d’un appel avec la valeur 6 (les flèches montrent où la valeur
de la fonction appelée est retournée).
En JavaScript, les fonctions sont des membres de première classe. Ce terme signifie que les
fonctions peuvent être traitées comme n’importe quelle donnée, pouvant être stockées dans
des variables ou passées en arguments à d’autres fonctions. Par exemple, nous pouvons
déclarer la fonction showMessage puis la stocker dans la variable sm.
function showMessage(message) {
console.log(`Message: ${message}`);
let sm = showMessage;
Nous pouvons stocker n’importe quelle fonction accessible dans ce scope dans une variable
et utiliser l’opérateur d’appel de fonction () pour l’exécuter. Nous pouvons vérifier que la
variable sm est maintenant une fonction en utilisant l’opérateur typeof.
Mais il est important de se rappeler que lors de l’affectation d’une fonction à une variable,
nous n’utilisons pas l’opérateur d’appel de fonction, car cela exécuterait la fonction et
affecterait le résultat de la fonction à la variable, et non pas la fonction elle-même.
function doNothing() {
return undefined;
Cette propriété est particulièrement utile lorsqu’on passe la fonction comme paramètre à
d’autres fonctions, ce que nous verrons bientôt. Pour l’instant, testons que c’est
effectivement possible.
function add(a, b) {
return a + b;
function multiply(a, b) {
return a * b;
La fonction operation prend en premier argument une fonction (func) et l’appelle avec les
deux autres arguments passés (first et second).
Pour stocker une fonction dans une variable ou la passer comme argument, il n’est pas
nécessaire de la déclarer auparavant et d’utiliser son nom.
function add(a, b) {
return a + b;
return a + b;
Dans cet exemple, nous déclarons à nouveau la fonction add et la stockons simultanément
dans la variable myAdd.
Cette forme de définition de fonction s’appelle expression de fonction. Ici, il s’agit d’une
expression de fonction nommée, car la fonction a un nom (add). Il existe également une
version anonyme, c’est-à-dire une expression de fonction sans nom :
return a + b;
Revenons au concept de fonctions anonymes. Il peut sembler déroutant d’utiliser un nom (ici
une variable) pour se référer à une fonction. Dans ce cas, il s’agit de l’anonymat, c’est-à-dire
l’absence de nom dans la définition même de la fonction. Cela devient plus évident lorsqu’on
passe la fonction comme paramètre à une autre fonction.
Exemple :
return a + b;
console.log(operation(function(a, b) {
return a * b;
Dans le premier cas, nous passons la fonction myAdd. Dans le second, nous passons
directement une fonction anonyme. Le résultat est le même, mais la fonction anonyme n’a
pas de nom.
5.1.5 Callbacks
Les fonctions passées comme arguments à d’autres fonctions sont appelées callbacks. Elles
peuvent sembler exotiques, mais elles sont très importantes en programmation. Une
fonction qui reçoit un callback comme argument peut l’appeler à tout moment. Dans nos
exemples, le callback est exécuté synchroniquement, c’est-à-dire dans un ordre strictement
défini.
Callbacks synchrones
console.log('inner 1');
console.log('outer 1');
callback();
console.log('outer 2');
console.log('test 1');
outer(inner);
console.log('test 2');
Sortie :
test 1
outer 1
inner 1
outer 2
test 2
L’ordre des actions est donc respecté. Mais il peut être perturbé dans certaines circonstances
spéciales.
Pour JavaScript côté client dans un navigateur, elle est basée sur la programmation
événementielle : la réponse asynchrone à certains événements (clic, timer, réception de
données…).
console.log('inner 1');
console.log('outer 1');
setTimeout(callback, 1000);
console.log('outer 2');
console.log('test 1');
outer(inner);
console.log('test 2');
test 1
outer 1
outer 2
test 2
...
inner 1
console.log('inner 1');
console.log('outer 1');
console.log('outer 2');
setTimeout(function(){
clearInterval(timerId);
}, 5500);
console.log('test 1');
outer(inner);
console.log('test 2');
Sortie :
outer 1
outer 2
test 2
...
inner 1
inner 1
inner 1
inner 1
inner 1
Les appels asynchrones peuvent aussi venir d’événements générés par l’utilisateur. Exemple :
window.addEventListener("click", function() {
console.log("clicked!");
});
Une fonction fléchée est une forme courte d’une expression de fonction.
Si une seule instruction retourne une valeur, return peut être omis.
On a vu :
Callbacks et récursion
Tri descendant.
Utiliser récursion