iducationducation
IndexArticlesFormationsProfilOutilsBibliothech
N°014 — 2026
Navigation
01Index02Articles03Formations04Profil05Outils06Bibliothech
N°014 — 2026
iducationducation
IndexArticlesFormationsProfilOutilsBibliothech
N°014 — 2026
Navigation
01Index02Articles03Formations04Profil05Outils06Bibliothech
N°014 — 2026
Formations
JavaScript · Débutant

JavaScript

Apprendre JavaScript de zéro jusqu'au niveau expert : syntaxe moderne, DOM, asynchrone et event loop, modules, prototypes, métaprogrammation, performance et mémoire.

JavaScript ES2025Node.jsDOMVitestVite
01Introduction et environnement02Variables, types et coercition03Conditions et boucles04Fonctions, portée et closures05Objets, tableaux, Map et Set06Le DOM et les événements07Asynchrone : callbacks, promesses, async/await et event loop08Modules, npm, outillage et tests09Prototypes, classes et this10Itérateurs, générateurs, Symbol, Proxy et métaprogrammation11Niveau expert : moteur, performance, mémoire et architecture
Chapitre 3·25 min

Conditions et boucles

JavaScript hérite sa syntaxe de contrôle du C : accolades, parenthèses, switch avec break. Rien d'exotique ici, mais plusieurs variantes de boucles coexistent et chacune a son usage précis.

if / else

const note = 14
let mention
 
if (note >= 16) {
  mention = 'Très bien'
} else if (note >= 14) {
  mention = 'Bien'
} else {
  mention = 'Passable'
}

L'opérateur ternaire pour les choix simples :

const statut = age >= 18 ? 'majeur' : 'mineur'

N'imbriquez pas les ternaires. Au deuxième niveau, repassez à if ou à une table de correspondance.

Tables de correspondance plutôt que switch

switch (code) {
  case 200:
  case 201:
    message = 'Succès'
    break
  case 404:
    message = 'Introuvable'
    break
  default:
    message = 'Erreur'
}

Oublier un break fait « tomber » dans le cas suivant. Pour une simple correspondance, un objet est plus sûr et plus court :

const MESSAGES = { 200: 'Succès', 201: 'Succès', 404: 'Introuvable' }
const message = MESSAGES[code] ?? 'Erreur'

Retour anticipé

Plutôt que des if imbriqués, sortez dès qu'une condition n'est pas remplie :

function traiterCommande(commande) {
  if (!commande) return null
  if (commande.articles.length === 0) return { erreur: 'Panier vide' }
  if (!commande.paiement) return { erreur: 'Paiement manquant' }
 
  return valider(commande)
}

La boucle for classique

for (let i = 0; i < 5; i++) {
  console.log(i)
}

Avec let, chaque itération a son propre i. Avec var, toutes les closures partagent le même :

for (var i = 0; i < 3; i++) setTimeout(() => console.log(i))   // 3, 3, 3
for (let i = 0; i < 3; i++) setTimeout(() => console.log(i))   // 0, 1, 2

for...of : itérer sur les valeurs

La boucle à utiliser par défaut pour les tableaux, chaînes, Map, Set :

for (const fruit of ['pomme', 'kiwi']) {
  console.log(fruit)
}
 
for (const [i, fruit] of ['pomme', 'kiwi'].entries()) {
  console.log(i, fruit)
}
 
for (const [cle, valeur] of new Map([['a', 1], ['b', 2]])) {
  console.log(cle, valeur)
}

for...in : itérer sur les clés d'un objet

const user = { nom: 'Ada', age: 36 }
for (const cle in user) {
  console.log(cle, user[cle])
}

for...in parcourt aussi les propriétés héritées énumérables et renvoie des chaînes. Ne l'utilisez jamais sur un tableau. Pour un objet, je préfère Object.entries :

for (const [cle, valeur] of Object.entries(user)) {
  console.log(cle, valeur)
}
BoucleParcourtÀ utiliser pour
for (;;)indicesbesoin de contrôler le pas ou l'index
for...ofvaleurs d'un itérabletableaux, strings, Map, Set
for...inclés énumérablesquasiment jamais
.forEach()éléments d'un tableaustyle fonctionnel, sans break possible

while et do...while

let tentatives = 0
while (tentatives < 3 && !connecte) {
  connecte = essayerConnexion()
  tentatives++
}
 
let saisie
do {
  saisie = demander()
} while (!saisie)

break, continue et labels

for (const n of [1, 2, 3, 4, 5]) {
  if (n === 2) continue
  if (n === 4) break
  console.log(n)   // 1, 3
}

Pour sortir de deux boucles imbriquées, un label :

recherche: for (const ligne of grille) {
  for (const cellule of ligne) {
    if (cellule === cible) {
      console.log('trouvé')
      break recherche
    }
  }
}

C'est rare. Si vous en avez besoin, extraire une fonction avec un return est souvent plus clair.

Exercice : FizzBuzz et nombre mystère

for (let n = 1; n <= 100; n++) {
  const sortie = (n % 3 === 0 ? 'Fizz' : '') + (n % 5 === 0 ? 'Buzz' : '')
  console.log(sortie || n)
}

Nombre mystère dans Node :

mystere.js
import readline from 'node:readline/promises'
 
const rl = readline.createInterface({ input: process.stdin, output: process.stdout })
const secret = Math.floor(Math.random() * 100) + 1
let essais = 0
 
while (true) {
  const n = Number(await rl.question('Ton nombre : '))
  essais++
  if (Number.isNaN(n)) console.log('Entre un nombre')
  else if (n < secret) console.log('Plus grand')
  else if (n > secret) console.log('Plus petit')
  else {
    console.log(`Trouvé en ${essais} essais`)
    break
  }
}
rl.close()

Renommez le fichier en mystere.mjs ou ajoutez "type": "module" dans package.json pour pouvoir utiliser import et await au niveau supérieur.


for...of pour les valeurs, Object.entries pour les objets, retours anticipés pour aplatir les conditions : trois habitudes qui rendent le code nettement plus lisible dès les premiers projets.

Précédent
Variables, types et coercition
Suivant
Fonctions, portée et closures

Développeur fullstack passionné. J'apprends en construisant et je documente tout — front, back, outils. Le code s'apprend mieux en public.

Naviguer

IndexTous les articlesFormationsProfilOutilsBibliothech

Ailleurs

GitHub RSS

Newsletter

Les articles, libs et découvertes. Une fois par semaine, pas plus.

© 2026 William LoreeConçu & codé à la main