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 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.
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.
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'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)
}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, 2La 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)
}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)
}| Boucle | Parcourt | À utiliser pour |
|---|---|---|
for (;;) | indices | besoin de contrôler le pas ou l'index |
for...of | valeurs d'un itérable | tableaux, strings, Map, Set |
for...in | clés énumérables | quasiment jamais |
.forEach() | éléments d'un tableau | style fonctionnel, sans break possible |
let tentatives = 0
while (tentatives < 3 && !connecte) {
connecte = essayerConnexion()
tentatives++
}
let saisie
do {
saisie = demander()
} while (!saisie)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.
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 :
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.