Les bases de JavaScript
Un bouton qui réagit, un formulaire qui vérifie ton adresse, un jeu qui tourne dans un onglet : derrière, il y a du JavaScript. C'est le langage de programmation que tous les navigateurs exécutent. Une page web, c'est trois langages qui travaillent ensemble.
Après cette fiche, tu sais
- déclarer des variables avec let et const, et suivre ce que contient la mémoire ligne après ligne ;
- reconnaître les types de valeurs et prévoir ce que font + et == quand les types diffèrent ;
- écrire des conditions et des boucles, et dérouler une boucle à la main ;
- écrire une fonction, l'appeler, et dire où une variable est visible ;
- ranger des données dans des tableaux et des objets.
Donner un nom à une valeur
Un programme JavaScript est une suite d'instructions, exécutées de haut en bas. Dans une page web, on les écrit entre les balises <script> ; on peut aussi les taper une à une dans la console du navigateur (outils de développement, souvent la touche F12), ou les lancer hors du navigateur avec Node.js.
<script>
console.log("Bonjour !");
</script>
Bonjour !
Pour retenir une valeur, on la range dans une variable : un nom qui désigne une valeur en mémoire. On déclare une variable avec let si sa valeur va changer, avec const si elle ne doit plus être réassignée.1
Variable qu'on peut réassigner : let score = 0; puis score = 10;.
Constante : elle reçoit sa valeur tout de suite et ne peut plus être réassignée. C'est le bon choix par défaut.
Tu croiseras aussi var, l'ancienne façon de déclarer, d'avant 2015. Elle n'a pas de portée de bloc (on verra ce que c'est dans la notion 6) : dans du code neuf, on utilise let et const. Le standard du langage s'appelle ECMAScript, et let et const sont arrivés avec sa version de 2015.1
Fais défiler : une instruction s'éclate en morceaux.
Une instruction complète : on crée une constante prenom qui contient le texte "Léa".
Le mot-clé déclare, le nom est choisi par toi, le signe = range la valeur, le ; termine l'instruction.
Une case nommée prenom apparaît en mémoire, avec "Léa" dedans. En JavaScript, = veut dire « ranger », jamais « est égal ».
_ et $, sans espace et sans chiffre au début. JavaScript distingue majuscules et minuscules : note et Note sont deux variables différentes.1 L'habitude : des noms parlants en camelCase, comme noteFinale.La mémoire, ligne par ligne
Fais défiler : sept lignes s'exécutent l'une après l'autre. Surveille les cases de la mémoire et la console. Tu peux aussi toucher un numéro de ligne.
Ce que contient la mémoire
ligne 0 sur 7score …
Que contient la mémoire ?
Trois petits programmes. Déroule-les dans ta tête, ligne par ligne, puis choisis.
Toutes les valeurs ne se ressemblent pas
Chaque valeur a un type. La norme en définit huit : sept types primitifs et les objets.1 On n'écrit jamais le type d'une variable : JavaScript le déduit de la valeur, et une même variable let peut recevoir un nombre, puis un texte.
| Type | Exemples | Sert à |
|---|---|---|
number | 42, 4.5, -0.5 | tous les nombres |
string | "Léa", 'VD', `5 CHF` | du texte (une chaîne) |
boolean | true, false | vrai ou faux |
undefined | undefined | pas encore de valeur |
null | null | aucune valeur, exprès |
bigint, symbol | 10n | grands entiers, identifiants |
| objet | [4, 5], { note: 5 } | tableaux, objets, fonctions |
4.5. La virgule sépare des éléments, comme dans [4.5, 5]. Dans le texte de cette fiche, on écrit 4,5, comme en maths.L'opérateur typeof donne le type d'une valeur, sous forme de texte : typeof 42 vaut "number", typeof "42" vaut "string". Deux réponses surprennent :2
typeof nullvaut"object": un héritage de la toute première version du langage ; une correction a été proposée pour la norme, puis rejetée.nullest pourtant une valeur primitive ;typeof [4, 5]vaut aussi"object": un tableau est un objet. Pour le reconnaître, on écritArray.isArray(t).
Range chaque valeur selon typeof
Touche une valeur, puis la case de ce que renvoie typeof. Méfie-toi de deux d'entre elles.
Calculer, coller, comparer
Les nombres se calculent avec +, -, *, /, ** (puissance) et % (reste de la division : 7 % 2 vaut 1, pratique pour savoir si un nombre est pair). Mais + a deux métiers : il additionne les nombres et il colle les chaînes. Dès qu'un des deux côtés est une chaîne, l'autre est converti en chaîne.3
"5" + 2 // "52"
"5" - 2 // 3
1 + 2 + "3" // "33"
`${"Léa"} a ${5.5}` // "Léa a 5.5"
Ligne 1 : 2 devient "2", puis les deux chaînes sont collées. Ligne 2 : le - n'existe que pour les nombres, "5" devient 5. Ligne 3 : on calcule de gauche à droite, 1 + 2 = 3, puis 3 + "3" colle. Ligne 4 : un gabarit, entre accents graves, insère des valeurs dans un texte avec ${…}.
Ces conversions faites en douce s'appellent la coercition. Pour éviter les surprises, on convertit soi-même : Number("42") donne 42, String(42) donne "42". Une conversion impossible donne NaN (Not a Number) : Number("4,5") vaut NaN, parce que la virgule n'est pas un séparateur décimal en JavaScript.
Les nombres sont rangés en binaire sur 64 bits (norme IEEE 754), et 0,1 n'a pas d'écriture binaire exacte. Résultat : 0.1 + 0.2 vaut 0.30000000000000004, et 0.1 + 0.2 === 0.3 vaut false. Pour comparer des nombres à virgule, on tolère un petit écart : Math.abs(a - b) < 1e-9.5
Comparer : == ou === ?
Les comparaisons <, >, <=, >= renvoient un booléen. Pour l'égalité, JavaScript en a deux : === (égalité stricte) compare sans rien convertir, et des types différents donnent toujours false ; == (égalité faible) convertit d'abord les valeurs vers un même type. MDN le dit sans détour : l'égalité stricte est presque toujours celle qu'il faut utiliser.4 Leurs contraires sont !== et !=.
La machine à comparer
Fais défiler : cinq paires de valeurs passent par == puis par ===. Regarde quand une valeur est convertie, et quand la machine refuse de le faire.
1 et "1"
Vrai, faux, et tout le reste
Dans un if, n'importe quelle valeur est convertie en booléen. Huit valeurs primitives deviennent false, on les dit falsy : false, 0, -0, 0n, "" (la chaîne vide), null, undefined et NaN. Toutes les autres sont truthy, y compris "0", " " et le tableau vide [].6 Les opérateurs logiques combinent les conditions : && (et), || (ou), ! (non).
Que vaut chaque expression ?
Huit expressions, toutes vérifiées dans un vrai moteur JavaScript. Réfléchis avant de toucher.
Faire un choix
if exécute un bloc seulement si sa condition est vraie ; else if teste une autre condition, et else attrape tous les autres cas. Les conditions sont testées de haut en bas, et seule la première vraie est exécutée.
const note = 4.5;
if (note >= 4) {
console.log("Suffisant");
} else {
console.log("Insuffisant");
}
// ternaire : condition ? oui : non
const verdict = note >= 4
? "réussi"
: "à retravailler";
Suffisant
if (note = 6) ne compare rien : il range 6 dans note, et 6 est truthy, donc le bloc s'exécute toujours. Pour comparer, c'est === (ou >=, <…).
Remets la fonction dans l'ordre
Avec 6, la fonction doit répondre « très bien » ; avec 4,5, « suffisant » ; avec 3,5, « insuffisant ». Touche une ligne, puis celle avec laquelle l'échanger. Attention à l'ordre des conditions.
Répéter sans recopier
Une boucle répète un bloc tant qu'une condition est vraie. La boucle for regroupe trois choses entre ses parenthèses : l'initialisation (let i = 0, faite une fois), la condition (i < notes.length, testée avant chaque tour) et le pas (i++, qui ajoute 1 à la fin de chaque tour).
Une boucle tourne
Fais défiler : la boucle calcule la moyenne de quatre notes. Suis i, la condition et la somme à chaque tour, comme si tu exécutais le code à la main.
La moyenne de quatre notes
tour 0 sur 4i ·somme ·
Deux autres boucles reviennent souvent. while répète tant que sa condition est vraie, sans compteur intégré ; for…of parcourt directement les valeurs d'un tableau, sans indice :
let n = 0;
while (n <= 10) { // 0, 2, 4… 10
console.log(n);
n += 2; // sinon : boucle infinie
}
let total = 0;
for (const note of [4.5, 5, 3.5, 6]) {
total += note; // 19 à la fin
}
Combien de tours ?
Pour chaque boucle, compte combien de fois le corps s'exécute. Un indice : écris les valeurs successives du compteur.
Écrire une fois, utiliser partout
Une fonction est un bloc de code nommé. Elle reçoit des paramètres (ci-dessous, notes), fait son travail et renvoie un résultat avec return. On la déclare une fois, on l'appelle autant qu'on veut, avec des arguments à chaque fois différents.
function moyenne(notes) {
let somme = 0;
for (const n of notes) somme += n;
return somme / notes.length;
}
moyenne([4.5, 5, 3.5, 6]); // 4.75
moyenne([6, 5]); // 5.5
// fonction fléchée : plus courte
const arrondiDemi = note =>
Math.round(note * 2) / 2;
arrondiDemi(4.75); // 5
Une fonction qui calcule sans return renvoie undefined. Et return arrête la fonction : les lignes placées après ne s'exécutent jamais.
Où vit une variable ?
Une variable n'est pas visible partout : sa portée dépend de l'endroit où elle est déclarée. let et const vivent dans le bloc entre accolades où elles sont nées ; var vit dans toute la fonction.1 Fais défiler.
let x = 1 est déclarée dans le bloc du if : x n'existe qu'entre ses accolades.
Après l'accolade fermante, console.log(x) ne trouve rien : ReferenceError, x n'est pas défini.
Avec var, x ignore le bloc et vit dans toute la fonction : la même ligne affiche 1. C'est une source de bugs, d'où let.
Une variable est cherchée dans le bloc, puis dans les blocs qui l'entourent, jusqu'à la portée globale : taux est trouvé. Jamais dans l'autre sens.
Trois programmes, trois erreurs
Chaque programme tourne, mais donne un résultat faux. Trouve pourquoi.
Ranger plusieurs valeurs ensemble
Un tableau est une liste ordonnée. Ses cases sont numérotées à partir de 0 : dans const notes = [4.5, 5, 3.5], notes[0] vaut 4.5, notes.length vaut 3, et la dernière case est notes[notes.length - 1]. Lire une case qui n'existe pas donne undefined, sans erreur.
const notes = [4.5, 5, 3.5, 6];
notes.push(5.5); // 5 notes
notes.includes(6); // true
notes.map(n => n * 2);
// [9, 10, 7, 12, 11] : nouveau tableau
notes.filter(n => n < 4); // [3.5]
const eleve = {
prenom: "Léa",
canton: "VD",
notes: [5, 4.5]
};
eleve.prenom; // "Léa"
eleve["canton"]; // "VD"
eleve.age = 16; // ajoutée
Un objet regroupe des valeurs nommées, ses propriétés : une clé, deux points, une valeur. On lit une propriété avec un point (eleve.prenom) ou des crochets (eleve["canton"]). Un tableau d'objets décrit toute une classe : c'est exactement la forme des données JSON qu'envoient les serveurs.
const notes = [4, 5] interdit d'écrire notes = […], mais notes.push(6) fonctionne : la constante désigne toujours le même tableau, dont le contenu change.1
Pourquoi ? Une variable ne contient pas le tableau lui-même, mais une référence vers lui. Fais défiler.
let a = 5; let b = a; : b reçoit une copie de la valeur de a.
b = 9; ne touche que b : a vaut toujours 5.
const t = [1, 2]; const u = t; : un seul tableau existe, t et u pointent tous les deux vers lui.
u.push(3); modifie ce tableau commun : t le voit aussi, et t === u vaut true.
const v = [...t]; crée un nouveau tableau avec les mêmes éléments : t === v vaut false, et modifier v ne change plus t.
Tableaux et objets
Quatre questions sur les indices, push, filter et les propriétés.
Les pièges classiques
Un seul signe = range une valeur. Dans un if, il rend la condition presque toujours vraie.
Ce qu'on lit dans un champ de formulaire est une chaîne : "4" + 1 vaut "41". Convertis d'abord avec Number(…).
4,5 n'est pas un nombre en JavaScript, et Number("4,5") vaut NaN. Dans le code : 4.5.
Les indices vont de 0 à length - 1. Une boucle écrite avec i <= t.length lit t[t.length], qui vaut undefined : une somme devient NaN.
x === NaN vaut toujours false, même si x vaut NaN. On écrit Number.isNaN(x).
const interdit de réassigner la variable, pas de modifier le tableau ou l'objet qu'elle désigne.
Exercices corrigés
Cherche d'abord, sur papier ou dans la console, puis ouvre le corrigé. Chaque solution a été exécutée.
1Écris une fonction estPair(n) qui renvoie true si n est pair.Voir le corrigé
function estPair(n) {
return n % 2 === 0;
}
estPair(7); // false
estPair(-4); // true
Un nombre est pair si le reste de sa division par 2 vaut 0. La comparaison n % 2 === 0 donne déjà un booléen : inutile d'écrire un if.
2Écris une fonction max(t) qui renvoie la plus grande valeur d'un tableau non vide, avec une boucle.Voir le corrigé
function max(t) {
let plusGrand = t[0];
for (const x of t) {
if (x > plusGrand) plusGrand = x;
}
return plusGrand;
}
max([4, 5.5, 3, 6, 2]); // 6
On part de la première valeur, puis on la remplace chaque fois qu'on rencontre plus grand. Partir de 0 serait faux pour un tableau de nombres négatifs. (JavaScript le fait aussi tout seul : Math.max(...t).)
3Combien de notes sont insuffisantes (sous 4) dans [4.5, 3.5, 5, 2.5, 4] ? Écris le code de deux façons.Voir le corrigé
const notes = [4.5, 3.5, 5, 2.5, 4];
let compte = 0;
for (const n of notes) {
if (n < 4) compte++;
}
// compte vaut 2
notes.filter(n => n < 4).length; // 2
2 (3,5 et 2,5). Le 4 n'est pas compté : 4 < 4 est faux. La seconde version garde les notes insuffisantes dans un nouveau tableau, puis lit sa longueur.
4Ton école arrondit les moyennes au demi-point. Écris arrondiDemi(note) : 4,74 doit donner 4,5 et 4,75 doit donner 5.Voir le corrigé
function arrondiDemi(note) {
return Math.round(note * 2) / 2;
}
arrondiDemi(4.74); // 4.5
arrondiDemi(4.75); // 5
Les demi-points deviennent des entiers quand on multiplie par 2 (4,75 × 2 = 9,5). Math.round arrondit à l'entier le plus proche (9,5 donne 10), puis on divise par 2 pour revenir à l'échelle des notes.
La fiche en huit lignes
Teste-toi
Sources
- MDN Web Docs, Types et grammaire (standard ECMAScript ; let, const et var ; portée de bloc ; remontée et zone morte temporelle ; sensibilité à la casse ; sept types primitifs et les objets ; propriétés d'un objet constant modifiables). developer.mozilla.org
- MDN Web Docs, typeof (tableau des résultats ; typeof null vaut "object", héritage de la première implémentation, correction proposée puis rejetée ; typeof NaN vaut "number" ; Array.isArray pour reconnaître un tableau). developer.mozilla.org
- MDN Web Docs, Addition (+) (si l'un des opérandes est une chaîne, l'autre est converti en chaîne et les deux sont concaténés ; sinon, addition numérique). developer.mozilla.org
- MDN Web Docs, Égalité en JavaScript (égalité stricte sans conversion, égalité faible avec conversion, null == undefined, NaN différent de lui-même ; « l'égalité stricte est presque toujours l'opération de comparaison qu'il convient d'utiliser »). developer.mozilla.org
- MDN Web Docs, Number.EPSILON (0.1 + 0.2 vaut 0.30000000000000004 ; format binaire IEEE 754 en double précision ; comparaison avec une tolérance). developer.mozilla.org
- MDN Web Docs, Falsy (valeurs considérées comme fausses : false, 0, -0, 0n, "", null, undefined, NaN, et l'objet historique document.all). developer.mozilla.org
Fiche écrite et sourcée en octobre 2026. Tous les extraits de code ont été exécutés avec Node.js 25.