Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

📜 JavaScript – Le Langage du Web

Guide dense : Types, DOM, this, class, Promises, async/await & AJAX (fetch).

1.1 Facile

Vue d'ensemble

Interprété (JIT), Moteur V8, Single-Thread, Non-bloquant.

Interprété V8
1.2 Facile

Intégration & Console

Balise <script>, async, defer, console.log().

<script> console.log
1.3 Facile

Variables & Scope

var (global), let (bloc), const (bloc). Hoisting.

let const
1.4 Moyen

Types & Coercion

Typage dynamique, === vs ==, typeof, Truthy/Falsy.

Typage Dynamique ===
1.5 Facile

Opérateurs

Arithmétique (+, %), Comparaison (===), Logique (&&, ||), Ternaire (?).

&& || ?? ?:
1.6 Facile

Instructions (ContrĂŽle)

Flux de contrĂŽle : if/else, switch, Boucles (for, while).

if/else for switch
1.7 Moyen

Compatibilité & Moteurs

Moteurs (V8, SpiderMonkey), MDN, Can I Use, Polyfills, Transpilers (Babel).

Can I Use Babel
2.1 Facile

Fonctions

Déclaration, Expression, Arrow (=>), ParamÚtres (défaut, rest).

function => (Arrow)
2.2 Avancé

Closures (Fermetures)

Une fonction se souvient de son scope lexical (pĂšre).

Closure Scope
2.3 Avancé

Le mot-clé this

Contexte d'exécution. .bind(), .call(), .apply(). this lexical (=>).

this bind
2.4 Moyen

Arrays (Méthodes)

.map(), .filter(), .reduce(), .forEach(). (Immutabilité).

map filter reduce
3.1 Avancé

OOP : Prototypes

Héritage prototypal (__proto__), Object.create(), .prototype.

prototype __proto__
3.2 Moyen

OOP : class (ES6)

Sucre syntaxique. constructor, extends, super().

class extends
3.3 Moyen

ES6+ (Syntaxe)

Destructuring ({...}, [...]), Spread (...), Rest (...).

Destructuring Spread (...)
3.4 Facile

Gestion des Erreurs

try...catch...finally, throw new Error().

try catch
4.1 Facile

Le DOM (Sélection)

document, getElementById, querySelector.

DOM querySelector
4.2 Facile

DOM (Manipulation)

createElement, append, .innerHTML, .style, .classList.

createElement style
4.3 Facile

ÉvĂ©nements

addEventListener ('click', ...), objet event, preventDefault.

addEventListener event
4.4 Avancé

Event Loop & Callbacks

Call Stack, Web APIs, Callback Queue. "Callback Hell".

Event Loop Callback
5.1 Moyen

Asynchrone : Promises

.then(), .catch(), .finally(), Promise.all().

Promise .then
5.2 Moyen

Asynchrone : async/await

Sucre syntaxique pour les Promises. try/catch.

async await
5.3 Moyen

📡 AJAX (fetch / XHR)

fetch() (moderne), XMLHttpRequest (ancien).

fetch AJAX
5.4 Moyen

Modules (ESM)

Syntaxe import et export (ES6) pour scinder le code.

import export
5.5 Moyen

Écosystùme (Node.js & npm)

Runtime JS cÎté serveur (Node) et gestionnaire de paquets (npm).

Node.js npm
5.6 Moyen

Frameworks & Librairies

Outils pour UI: React, Vue.js, Angular, Svelte. DOM Virtuel.

React Vue.js
1.1 Vue d'ensemble (Moteur V8 & Event Loop)
Qu'est-ce que JavaScript ?

JavaScript (JS) est le langage de programmation du web. C'est un langage :

  • InterprĂ©tĂ© (ou "JIT") : Le code est lu et exĂ©cutĂ© "Ă  la volĂ©e" par un moteur (ex: V8 de Chrome, SpiderMonkey de Firefox) via une compilation JIT (Just-In-Time) pour la performance.
  • Typage dynamique : Les types des variables (string, number) sont vĂ©rifiĂ©s Ă  l'exĂ©cution, pas Ă  la compilation (contrairement Ă  TypeScript/Java/Rust).
  • Single-Threaded (Mono-thread) : JS exĂ©cute une seule chose Ă  la fois (sur le "thread principal").
Single-Thread & Non-Bloquant

Si JS est "single-thread", comment peut-il gérer plusieurs choses (ex: un timer, un clic, un appel réseau) ?

GrĂące Ă  la Boucle d'ÉvĂ©nements (Event Loop). Les opĂ©rations "longues" (I/O, fetch, setTimeout) sont dĂ©lĂ©guĂ©es au navigateur (Web APIs). Une fois terminĂ©es, elles placent une "callback" (fonction de rappel) dans une file d'attente. L'Event Loop les exĂ©cute dĂšs que le thread principal est libre.

(Voir 4.4 pour le schéma)

1.2 Intégration HTML (<script>) & Console
Chargement (<script>)

On place le JS dans le <head> ou (mieux) Ă  la fin du <body>.






La Console (Débogage)

console.log() est l'outil N°1 du développeur JS (disponible dans les Outils de Développement du navigateur, F12).

let user = { id: 1, nom: "Alice" };

// 1. Log simple
console.log("Démarrage...");

// 2. Log d'objet (interactif)
console.log(user);

// 3. Log d'erreur / Avertissement
console.warn("Attention...");
console.error("Erreur critique !");

// 4. Log tabulaire (pour les arrays d'objets)
console.table([user, { id: 2, nom: "Bob" }]);
1.3 Variables (let, const, var) & Scope

Depuis ES6 (2015), let et const remplacent var.

Mot-cléScope (Portée)Réassignable ?Hoisting ?
const (Défaut)Bloc {...}Non (Référence immuable)Non (Temporal Dead Zone)
letBloc {...}OuiNon (Temporal Dead Zone)
var (Legacy)Fonction (ou Global)OuiOui (Initialisé à undefined)
Exemple (let vs var)
// 'var' (scope de fonction)
function testVar() {
    if (true) {
        var x = 10;
    }
    console.log(x); // 10 (Le 'var' a "fuité" du bloc 'if')
}

// 'let' (scope de bloc)
function testLet() {
    if (true) {
        let y = 10;
    }
    console.log(y); // ReferenceError: y is not defined
}

// 'const'
const API_KEY = "abc";
// API_KEY = "123"; // TypeError: Assignment to constant.

const user = { nom: "Alice" };
user.nom = "Bob"; // OK (On mute l'objet, pas la référence)
// user = {}; // TypeError
1.4 Types, Coercion & ÉgalitĂ© (===)
Types (Primitifs vs Objets)

7 Types Primitifs (passés par valeur) :

  • string, number, boolean
  • null, undefined (absence de valeur)
  • symbol (ES6), bigint (ES2020)

Types Objets (passés par référence) :

  • Object ({...}), Array ([...])
  • Function, Date, RegExp, etc.
typeof "Hello"; // "string"
typeof 10;      // "number"
typeof true;    // "boolean"
typeof {};      // "object"
typeof [];      // "object" (un array EST un objet)
typeof null;    // "object" (Bug historique !)
typeof undefined; // "undefined"
Coercion & ÉgalitĂ© (== vs ===)

La **Coercion** est la conversion automatique (et dangereuse) des types par JS.

RĂšgle : Toujours utiliser ===.

// == (ÉgalitĂ© "lĂąche", avec coercion)
10 == "10";   // true (string -> number)
0 == false; // true (boolean -> number)
null == undefined; // true

// === (ÉgalitĂ© "stricte", sans coercion)
// (Vérifie la valeur ET le type)
10 === "10";   // false
0 === false; // false
null === undefined; // false
Truthy & Falsy

Valeurs "falsy" (fausses dans un if) :

false, 0, "" (string vide), null, undefined, NaN.

1.5 Opérateurs (Logique, Comparaison, Arithmétique)
Opérateurs Logiques

Utilisés pour combiner des expressions booléennes.

// ET Logique (&&)
// (Retourne la premiĂšre valeur "falsy", ou la derniĂšre "truthy")
true && true;   // true
true && false;  // false
"Alice" && 0; // 0

// OU Logique (||)
// (Retourne la premiĂšre valeur "truthy", ou la derniĂšre "falsy")
true || false;  // true
false || "Bob"; // "Bob"
0 || null;    // null
Opérateurs Avancés (ES2020+)

Raccourcis modernes pour gérer `null` ou `undefined`.

// Coalescence de nuls (??)
// (Similaire Ă  ||, mais ne rĂ©agit QU'À null/undefined,
// pas aux autres "falsy" comme 0 ou "")
let volume = 0;
const v1 = volume || 10; // 10 (faux, 0 est falsy)
const v2 = volume ?? 10; // 0 (correct)

// Optional Chaining (?.)
// (EmpĂȘche une erreur si l'objet est 'null')
const user = null;
const nom = user?.nom; // undefined (au lieu de TypeError)

// Opérateur Ternaire (?:)
// (Raccourci pour if/else)
const age = 20;
const statut = (age >= 18) ? "Majeur" : "Mineur";
Opérateurs de Comparaison

RÚgle : Toujours préférer === et !==.

// ÉgalitĂ© Stricte (valeur + type)
10 === 10;   // true
10 === "10"; // false

// Inégalité Stricte
10 !== "10"; // true

// ÉgalitĂ© "lĂąche" (avec coercion de type, Ă  Ă©viter)
10 == "10";  // true
0 == false;  // true

// Supérieur, Inférieur (classique)
10 > 5;  // true
10 >= 10; // true
5 < 8;  // true
Opérateurs Arithmétiques
let x = 10;
x + 5; // 15 (Addition)
x - 3; // 7 (Soustraction)
x * 2; // 20 (Multiplication)
x / 4; // 2.5 (Division)
x % 3; // 1 (Modulo / Reste de la division)
x ** 2; // 100 (Exponentielle ES6)

// Incrémentation / Décrémentation
x++; // x = 11 (post-incrémentation)
++x; // x = 12 (pré-incrémentation)
x--; // x = 11
Opérateurs d'Assignation
let y = 5;

// Assignation simple
y = 10;

// Raccourcis (combinés)
y += 5; // y = y + 5 (y = 15)
y -= 3; // y = y - 3 (y = 12)
y *= 2; // y = y * 2 (y = 24)
y /= 4; // y = y / 4 (y = 6)
1.6 Instructions (Flux de ContrĂŽle)
Conditions (if / else / switch)
// if / else if / else
const age = 25;
if (age < 18) {
    console.log("Mineur");
} else if (age >= 18 && age < 65) {
    console.log("Adulte");
} else {
    console.log("Senior");
}

// switch (pour tester une variable)
const role = "admin";
switch (role) {
    case "admin":
        console.log("AccĂšs total");
        break; // (Ne pas oublier 'break' !)
    case "editor":
        console.log("AccĂšs partiel");
        break;
    default:
        console.log("AccÚs refusé");
}
Boucles (for / while)

.forEach(), .map() sont souvent préférés pour les arrays (voir 2.4).

// Boucle 'for' (classique)
for (let i = 0; i < 5; i++) {
    console.log(i); // 0, 1, 2, 3, 4
}

// Boucle 'while'
let n = 0;
while (n < 3) {
    n++;
}
console.log(n); // 3

// Boucle 'for...of' (ES6 - pour itérables : Array, String)
const noms = ["Alice", "Bob"];
for (const nom of noms) {
    console.log(nom); // "Alice", "Bob"
}

// Boucle 'for...in' (pour propriétés d'objets)
const user = { nom: "Alice", age: 30 };
for (const cle in user) {
    console.log(`${cle}: ${user[cle]}`); // "nom: Alice", "age: 30"
}
1.7 Compatibilité (Moteurs, Polyfills & Transpilers)
Moteurs & Spécification (ECMAScript)

JavaScript n'est pas lié à un O/S, mais à un **Moteur** d'exécution.

  • ECMAScript (ES) : La spĂ©cification (la norme) qui dĂ©finit le langage (ex: ES6/ES2015, ES2020...).
  • JavaScript : L'implĂ©mentation de cette norme.
  • Moteurs Principaux :
    • V8 (Google Chrome, Node.js, Edge)
    • SpiderMonkey (Mozilla Firefox)
    • JavaScriptCore (Apple Safari)

La compatibilité dépend de la version d'ECMAScript supportée par le moteur.

Gérer l'Incompatibilité

Les navigateurs (surtout anciens, ex: IE11) ne supportent pas les syntaxes modernes (=>, async/await).

  • MDN & Can I Use : Sites web de rĂ©fĂ©rence pour vĂ©rifier la compatibilitĂ© d'une feature (ex: "Can I use fetch?").
  • Polyfill : Un script (ex: core-js) qui "recrĂ©e" une fonction manquante (ex: Promise) dans un vieux navigateur.
  • Transpiler (ex: Babel) : Un outil (ex: Babel) qui **traduit** le code moderne (ES6+) en vieux code (ES5) lors du "build", pour assurer une compatibilitĂ© maximale.
// Code Moderne (ES6)
const maFn = (nom) => `Hello ${nom}`;

// Code "Transpilé" par Babel (ES5)
"use strict";
var maFn = function maFn(nom) {
  return "Hello ".concat(nom);
};
2.1 Fonctions (Déclaration, Expression, Arrow)
Déclaration vs Expression
// 1. Déclaration de fonction
// (Hoisted : 'remontée', utilisable avant sa définition)
saluer("Alice"); // OK

function saluer(nom) {
    return `Bonjour, ${nom}`;
}

// 2. Expression de fonction
// (Non-hoisted : 'let'/'const' ne le sont pas)
// crier("Au secours !"); // ReferenceError

const crier = function(message) {
    return message.toUpperCase() + " !";
};

// (Les fonctions sont des citoyens de 1Ăšre classe:
// elles peuvent ĂȘtre assignĂ©es, passĂ©es en argument)
Fonctions Fléchées (Arrow) (ES6)

Syntaxe concise, et this lexical (voir 2.3).

// Syntaxe 1 (Multi-lignes, 'return' explicite)
const addition = (a, b) => {
    return a + b;
};

// Syntaxe 2 (Expression unique, 'return' implicite)
const soustraction = (a, b) => a - b;

// Syntaxe 3 (Un seul argument)
const carre = x => x * x;

// (Idéal pour map/filter)
const nombres = [1, 2, 3];
const doubles = nombres.map(n => n * 2); // [2, 4, 6]
2.2 Closures (Fermetures)

Concept fondamental en JS : Une Closure est une fonction qui "se souvient" de son **scope lexical (environnement de variables)**, mĂȘme si elle est exĂ©cutĂ©e en dehors de ce scope.

Exemple : Fabrique de fonctions
function creerCompteur() {
    // 'count' est dans le scope de 'creerCompteur'
    let count = 0;
    
    // Cette fonction (qui sera retournée)
    // forme une "closure" autour de 'count'.
    // Elle "capture" la variable 'count'.
    const incrementer = function() {
        count++; // (AccĂšde Ă  'count' du parent)
        console.log(count);
    };
    
    return incrementer;
}

// 1. On appelle la fabrique
const compteurA = creerCompteur();
// 'creerCompteur' a fini, son scope est "détruit",
// MAIS 'count' (pour compteurA) survit dans la closure.

const compteurB = creerCompteur(); // (Crée un *autre* scope, un *autre* 'count')

// 2. On appelle les closures
compteurA(); // 1
compteurA(); // 2
compteurB(); // 1 (Scope séparé)
compteurA(); // 3
2.3 Le mot-clé this (Contexte)

this est le "contexte d'exécution" de la fonction. Sa valeur est déterminée **à l'appel** (Dynamic Binding), sauf pour les fonctions fléchées.

Contexte d'AppelValeur de this
Appel simple (maFn())window (navigateur) ou undefined (en "strict mode").
Méthode (obj.maFn())L'objet avant le point (obj).
new MaClasse()La nouvelle instance (objet) en cours de création.
.call(T, ...), .apply(T, ...)L'objet T passé en premier argument.
Fonction FlĂ©chĂ©e (=>)Lexical : this de son parent (ne peut pas ĂȘtre modifiĂ©).
Exemple (Méthode vs Fléchée)
const user = {
    nom: "Alice",
    
    // 1. Méthode (this = 'user')
    saluer: function() {
        console.log(`Je suis ${this.nom}`); // "Je suis Alice"
    },
    
    // 2. Fléchée (this = 'window' ou 'undefined')
    partir: () => {
        console.log(`Au revoir ${this.nom}`); // "Au revoir undefined"
        // (Car 'this' est celui du scope global oĂč 'user' est dĂ©fini)
    },
    
    // 3. Callback (PiĂšge classique)
    init: function() {
        // 'this' est 'user'
        document.addEventListener('click', function() {
            // 'this' est 'document' (le contexte d'appel)
            console.log(this.nom); // undefined
        });
        
        // Solution (ES6 Arrow): 'this' lexical
        document.addEventListener('scroll', () => {
            // 'this' est hérité de 'init' (donc 'user')
            console.log(this.nom); // "Alice"
        });
    }
};
2.4 Arrays (Méthodes de Transformation)

Les méthodes .map, .filter, .reduce sont la base de la programmation fonctionnelle en JS. Elles n'altÚrent pas l'array d'origine (Immutabilité).

.map() (Transformation 1-pour-1)
const nombres = [1, 2, 3, 4];
// (Prend chaque 'n' et retourne 'n * 2')
const doubles = nombres.map(n => n * 2);
// doubles = [2, 4, 6, 8]
.filter() (Filtrage)
const nombres = [1, 2, 3, 4];
// (Garde 'n' si 'n > 2' est vrai)
const grands = nombres.filter(n => n > 2);
// grands = [3, 4]
.reduce() (Agrégation)
const nombres = [1, 2, 3, 4];
// (acc = accumulateur, curr = valeur courante)
// (0 = valeur initiale de l'accumulateur)
const somme = nombres.reduce((acc, curr) => {
    return acc + curr;
}, 0);
// somme = 10
3.1 OOP : L'Héritage Prototypal

Avant class, JS utilisait l'héritage prototypal. Les objets héritent d'autres objets (via une "chaßne de prototypes").

Quand on accĂšde Ă  obj.propriete, JS cherche sur obj. S'il ne trouve pas, il cherche sur obj.__proto__ (son prototype), puis obj.__proto__.__proto__, jusqu'Ă  Object.prototype (la base).

Approche (Fonction Constructeur)
// 1. Le "Constructeur" (une simple fonction)
function Animal(nom) {
    this.nom = nom;
}

// 2. On ajoute les méthodes partagées au 'prototype'
// (Tous les objets créés par 'new Animal'
// auront 'Animal.prototype' comme '__proto__')
Animal.prototype.crier = function() {
    console.log(this.nom + " fait du bruit.");
};

// 3. Héritage
function Chien(nom) {
    // Appelle le constructeur parent (similaire Ă  'super')
    Animal.call(this, nom); 
}

// 4. Lier la chaĂźne de prototypes
// (L'objet 'Chien.prototype' hérite de 'Animal.prototype')
Chien.prototype = Object.create(Animal.prototype);

// 5. Utilisation
const rex = new Chien("Rex");
rex.crier(); // "Rex fait du bruit."
// (JS trouve 'crier' sur rex.__proto__.__proto__)
3.2 OOP : Syntaxe class (ES6)

La syntaxe class (ES6) est du **sucre syntaxique** au-dessus de l'héritage prototypal (vu en 3.1). Cela rend JS plus familier pour les développeurs venant de Java ou C#.

// 1. Classe "Parent"
class Animal {
    // (Équivalent de la fonction constructeur)
    constructor(nom) {
        this.nom = nom;
    }
    
    // (Mis automatiquement sur 'Animal.prototype')
    crier() {
        console.log(this.nom + " fait du bruit.");
    }
}

// 2. Classe "Enfant"
class Chien extends Animal {
    constructor(nom) {
        // (Appelle 'Animal.constructor')
        super(nom); 
    }
    
    // (Surcharge la méthode parente)
    @Override // (N'existe pas en JS, mais c'est l'idée)
    crier() {
        console.log(this.nom + " aboie !");
    }
}

// 3. Utilisation
const rex = new Chien("Rex");
rex.crier(); // "Rex aboie !"
3.3 ES6+ (Destructuring, Spread & Rest)
Destructuring (Déstructuration)

Extraire des valeurs d'objets ou d'arrays.

// 1. Objets
const user = { id: 1, nom: "Alice", age: 30 };
// (Extrait 'nom' et 'age' dans des variables)
const { nom, age } = user;
console.log(nom); // "Alice"

// (Avec renommage)
const { nom: userName } = user;

// 2. Arrays (par position)
const [premier, deuxieme] = ["Or", "Argent", "Bronze"];
console.log(premier); // "Or"
Spread (...) (Décomposition)

Utilisé pour "étaler" les éléments (ex: copies, fusions).

// 1. Objets (Fusion/Copie)
const defaults = { admin: false, theme: "dark" };
const user = { nom: "Bob", ...defaults };
// user = { nom: "Bob", admin: false, theme: "dark" }

// 2. Arrays (Copie/Concat)
const arr1 = [1, 2];
const arr2 = [...arr1, 3, 4]; // [1, 2, 3, 4]

Rest (...) (Regroupement)

Utilisé dans les arguments de fonction (regroupe le "reste").

function maFn(premier, ...autres) {
    console.log(premier); // 1
    console.log(autres); // [2, 3, 4]
}
maFn(1, 2, 3, 4);
3.4 Gestion des Erreurs (try...catch)

Pour le code **synchrone**, on utilise try...catch...finally (similaire Ă  Java). (Pour l'asynchrone, voir Promises .catch() ou try/catch avec async/await).

Exemple (JSON Parse)
const jsonInvalide = "{ 'nom': 'Alice' }"; // (Invalide, utilise des quotes simples)

function parserJson(data) {
    try {
        // 1. (TRY) Code risqué (peut lever une erreur)
        const objet = JSON.parse(data);
        console.log("SuccĂšs:", objet.nom);
        return objet;
        
    } catch (erreur) {
        // 2. (CATCH) Gérer l'erreur
        // (l'objet 'erreur' contient 'name' et 'message')
        console.error("Erreur de parsing:", erreur.message);
        return null; // Retourner une valeur par défaut
        
    } finally {
        // 3. (FINALLY) Exécuté TOUJOURS (succÚs ou erreur)
        console.log("Tentative de parsing terminée.");
    }
}

parserJson(jsonInvalide);

// Lever (throw) une erreur manuellement
if (user.role !== "admin") {
    throw new Error("AccÚs refusé !");
}
4.1 Le DOM (Document Object Model)

Le DOM est l'API (l'interface) que le navigateur fournit à JavaScript pour interagir avec la page HTML. Le HTML est représenté comme un arbre d'objets (Nodes).

L'objet global (racine) est window. L'objet pour la page est document.

Sélection d'éléments
// 1. (Ancienne méthode) Sélection par ID
const titre = document.getElementById("main-title");

// 2. (Ancienne méthode) Sélection par Classe
// (Retourne une HTMLCollection, "live")
const items = document.getElementsByClassName("list-item");

// 3. (MODERNE) Sélection par sélecteur CSS
// (Retourne le *premier* élément correspondant)
const bouton = document.querySelector("#submit-btn");
const premierItem = document.querySelector(".list-item");

// 4. (MODERNE) Sélection multiple par sélecteur CSS
// (Retourne une NodeList, statique)
const tousLesItems = document.querySelectorAll(".list-item");

// Itérer sur une NodeList (avec forEach)
tousLesItems.forEach(item => {
    console.log(item);
});
4.2 Manipulation du DOM

Une fois un élément sélectionné, on peut lire ou modifier ses propriétés.

const titre = document.querySelector("#main-title");
const container = document.querySelector(".container");

// 1. Modifier le contenu (Texte)
titre.textContent = "Nouveau Titre (Texte)";

// 2. Modifier le contenu (HTML) (Attention: Risque XSS)
// titre.innerHTML = "Nouveau Titre (HTML)";

// 3. Modifier les styles (inline)
titre.style.color = "blue";
titre.style.backgroundColor = "white"; // (camelCase)

// 4. Modifier les classes (Recommandé)
titre.classList.add("important");
titre.classList.remove("old-class");
titre.classList.toggle("active");

// 5. Créer et ajouter un élément
const newDiv = document.createElement("div");
newDiv.textContent = "Je suis nouveau";
newDiv.classList.add("alert");

container.appendChild(newDiv); // Ajoute Ă  la fin
// container.prepend(newDiv); // Ajoute au début

// 6. Supprimer
newDiv.remove();
4.3 ÉvĂ©nements (addEventListener)

JS est "piloté par les événements" (event-driven). On "écoute" (listen) les actions de l'utilisateur (clic, scroll, clavier) ou du navigateur (load).

Écouteur d'Ă©vĂ©nement
const bouton = document.querySelector("#submit-btn");
const lien = document.querySelector("a");
const input = document.querySelector("input");

// 1. Écouteur (click)
bouton.addEventListener("click", function(event) {
    // 'this' = 'bouton'
    // 'event' = objet contenant les infos (souris, etc.)
    console.log("Bouton cliqué !");
});

// 2. ÉvĂ©nement (input)
input.addEventListener("input", (event) => {
    // (On utilise une arrow fn pour garder le 'this' extérieur)
    console.log(event.target.value); // (Valeur actuelle de l'input)
});

// 3. Annuler le comportement par défaut
lien.addEventListener("click", (event) => {
    event.preventDefault(); // (EmpĂȘche le lien de naviguer)
    console.log("Navigation annulée.");
});
4.4 La Boucle d'ÉvĂ©nements (Event Loop) & Callbacks
Le "Callback Hell" (L'enfer des callbacks)

Avant les Promises, le code asynchrone (ex: animations, appels réseau) s'enchaßnait avec des "callbacks", menant à une "pyramide" illisible :

// (Code illisible, difficile à débugger)
etape1(data, function(result1) {
    etape2(result1, function(result2) {
        etape3(result2, function(result3) {
            // ...
            etape4(result3, function(result4) {
                // ...
            });
        });
    });
});
Le ModÚle Asynchrone (Schéma)

1. fn() est appelée, setTimeout est délégué aux Web APIs.
2. console.log('Fin') s'exécute (le Stack est vide).
3. AprĂšs 1s, la Web API place callback() dans la Queue.
4. L'Event Loop déplace callback() dans le Stack.
5. callback() s'exécute.

console.log('Début');

setTimeout(function callback() {
    console.log('Timeout (1s)');
}, 1000);

console.log('Fin');

// ORDRE D'AFFICHAGE:
// 1. Début
// 2. Fin
// 3. Timeout (1s) (approx. 1 sec plus tard)
5.1 Asynchrone : Les Promises (Promesses)

Une **Promise** est un objet qui représente le résultat (succÚs ou échec) d'une opération asynchrone. C'est la solution au "Callback Hell".

États : pending (en cours), fulfilled (succĂšs), rejected (Ă©chec).

Consommation (.then, .catch)

Le chaĂźnage (.then) "aplatit" la pyramide.

// (fetch() est une API moderne qui retourne une Promise)

fetch('https://api.github.com/users/google')
    
    // 1. (SuccÚs de l'appel réseau)
    .then(response => {
        // (response.json() retourne aussi une Promise)
        if (!response.ok) {
            throw new Error("Erreur réseau: " + response.status);
        }
        return response.json(); 
    })
    
    // 2. (SuccĂšs de response.json())
    .then(data => {
        console.log("Data reçues:", data.name);
    })
    
    // 3. (Gestion centralisée des erreurs)
    .catch(erreur => {
        console.error("Échec global:", erreur.message);
    })
    
    // 4. (Exécuté dans tous les cas)
    .finally(() => {
        console.log("Appel terminé (succÚs ou échec).");
    });
5.2 Asynchrone : async / await (ES2017)

async/await est du sucre syntaxique au-dessus des Promises. Il permet d'écrire du code asynchrone qui *ressemble* à du code synchrone (bloquant), le rendant beaucoup plus lisible.

  • async : PlacĂ© devant une fonction, la fonction retourne *automatiquement* une Promise.
  • await : Utiliseable *uniquement* dans une fonction async. Il "pause" l'exĂ©cution de la fonction (pas le navigateur !) en attendant que la Promise soit rĂ©solue.
Exemple (équivalent 5.1)
// 1. Déclarer la fonction comme 'async'
async function fetchGithubUser(username) {
    
    try {
        // 2. 'await' pause la fonction
        const response = await fetch(`https.api.github.com/users/${username}`);
        
        if (!response.ok) {
            throw new Error("Erreur réseau: " + response.status);
        }
        
        // 3. 'await' pour la 2Ăšme Promise
        const data = await response.json();
        
        console.log("Data reçues:", data.name);
        return data;
        
    } catch (erreur) {
        // 4. Gestion des erreurs (synchrone !)
        console.error("Échec global:", erreur.message);
    } finally {
        console.log("Appel terminé.");
    }
}

// Utilisation
fetchGithubUser("google");
5.3 📡 AJAX (Asynchronous JavaScript and XML)

AJAX est la technique (pas une techno) permettant Ă  une page web de faire des requĂȘtes HTTP (ex: charger des donnĂ©es JSON) *aprĂšs* le chargement de la page, sans la recharger entiĂšrement.

fetch() (API moderne, basée sur les Promises)

(Voir 5.1 et 5.2 pour les exemples GET).

Exemple (POST)
async function postData(url = '', data = {}) {
  try {
    const response = await fetch(url, {
      method: 'POST', // (GET, POST, PUT, DELETE)
      headers: {
        'Content-Type': 'application/json'
        // 'Authorization': 'Bearer VOTRE_TOKEN'
      },
      body: JSON.stringify(data) // (Le corps doit ĂȘtre 'string')
    });

    if (!response.ok) {
        throw new Error("Erreur: " + response.status);
    }
    
    return await response.json(); // (Parse la réponse JSON)
    
  } catch (error) {
    console.error('Erreur Fetch:', error);
  }
}

// Utilisation
postData('https.api.example.com/users', { nom: 'Alice' });
XMLHttpRequest (XHR) (Ancienne API, basée sur les callbacks)

À connaütre pour la maintenance de code legacy.

function getData(url) {
    // 1. Créer l'objet
    const xhr = new XMLHttpRequest();

    // 2. Configurer (GET, url, async=true)
    xhr.open('GET', url, true);

    // 3. DĂ©finir le callback (quand la requĂȘte se termine)
    xhr.onload = function() {
        if (xhr.status >= 200 && xhr.status < 300) {
            // SuccĂšs
            const data = JSON.parse(xhr.responseText);
            console.log(data);
        } else {
            // Échec
            console.error("Erreur: " + xhr.status);
        }
    };
    
    // 4. Gérer les erreurs réseau
    xhr.onerror = function() {
        console.error("Erreur réseau");
    };

    // 5. Envoyer
    xhr.send();
}

getData('https.api.github.com/users/google');
5.4 Modules (ESM)
Modules ESM (import/export)

Permet de scinder le code en fichiers (modules) réutilisables. C'est la norme moderne, native dans les navigateurs (via <script type="module">) et dans Node.js.

// (fichier: utils.js)
// 1. Export nommé
export const PI = 3.14;

export function saluer(nom) {
    console.log(`Bonjour, ${nom}`);
}

// 2. Export par défaut (un seul par fichier)
export default function monExportParDefaut() {
    console.log("Export par défaut");
}

// (fichier: main.js)
// 1. Import 'default' (le nom 'maFn' est arbitraire)
import maFn from './utils.js';

// 2. Import nommé (les noms {...} doivent correspondre)
import { PI, saluer } from './utils.js';

// 3. Import 'namespace'
// import * as Utils from './utils.js';

console.log(PI); // 3.14
saluer("Monde");
maFn();
5.5 Écosystùme (Node.js & npm)
Qu'est-ce que Node.js ?

Node.js n'est *pas* un framework, c'est un **runtime** JavaScript (basé sur le moteur V8 de Chrome) qui permet d'exécuter du code JS **cÎté serveur** (backend).

Avant 2009, JS vivait *uniquement* dans le navigateur.

RĂŽle pour le Frontend :

  • Outils de Build : Fait tourner les outils (Vite, Webpack, Babel) qui optimisent, transpilent et "bundlent" votre code (CSS, JS, images).
  • Serveurs de Dev : Lance un serveur local pour tester votre application.
  • Backend (BFF) : Peut servir d'API (Backend-For-Frontend).
Qu'est-ce que npm ? (Addons/Plugins)

Node Package Manager. C'est le plus grand registre de bibliothĂšques de code ("paquets", "plugins" ou "addons") au monde.

Il est piloté par le fichier package.json à la racine de votre projet.

# 1. Initialiser un projet (crée package.json)
npm init -y

# 2. Installer un "plugin" (ex: lodash)
# (l'ajoute aux 'dependencies' dans package.json)
npm install lodash

# 3. Installer un outil de dev (ex: vite)
# (l'ajoute aux 'devDependencies')
npm install -D vite

# 4. Lancer un script (défini dans package.json)
npm run dev
5.6 Frameworks & Librairies (React, Vue.js)
Pourquoi ? (Le problĂšme du DOM)

Manipuler le DOM "Ă  la main" (voir 4.2) devient extrĂȘmement complexe et lent ("spaghetti code") dĂšs que l'application grandit.

Les frameworks offrent une approche **déclarative** : "Voici à quoi l'UI doit ressembler (en fonction de cet 'état')", et le framework gÚre le "comment" (la manipulation du DOM).

Concepts clés :

  • Composants : Morceaux d'UI rĂ©utilisables (ex: <MonBouton>).
  • État (State) : Les donnĂ©es qui pilotent l'UI. Si l'Ă©tat change, l'UI se met Ă  jour.
  • DOM Virtuel (VDOM) : (UtilisĂ© par React/Vue) Une copie lĂ©gĂšre du DOM en mĂ©moire, permettant au framework de calculer la mise Ă  jour la plus efficace.
Les "Trois Grands" (et d'autres)

React (Meta) : (Librairie) La plus populaire. Basée sur le VDOM et JSX (mélange de JS et HTML).

// Syntaxe React (JSX)
const App = ({ nom }) => {
  return 
Hello {nom}!
; };

Vue.js (Communauté) : (Framework) TrÚs apprécié pour sa courbe d'apprentissage douce et sa syntaxe claire (.vue files) qui sépare HTML (template), JS (script) et CSS (style).


  • Angular (Google) : Framework "tout-en-un" (opinionnĂ©), trĂšs structurĂ©, utilise TypeScript.
  • Svelte : Un "compilateur". Il n'utilise pas de VDOM et compile le code en JS "vanilla" optimisĂ©.
📜 Cheat-sheet (Syntaxe)
Variables & Fonctions
// Variables
const nom = "Alice"; // Constante (bloc)
let age = 30; // Réassignable (bloc)
var old = true; // (Scope fonction, évitez)

// Types & ÉgalitĂ©
10 === "10"; // false (Stricte)
10 == "10"; // true (Coercion)

// Fonction Fléchée
const add = (a, b) => a + b;

// try/catch
try {
  JSON.parse("{");
} catch (e) {
  console.error(e.message);
}
DOM & ÉvĂ©nements
// Sélection
const el = document.querySelector("#mon-id");

// Manipulation
el.textContent = "Nouveau";
el.style.color = "red";
el.classList.add("active");

// ÉvĂ©nement
el.addEventListener("click", (e) => {
  e.preventDefault();
  console.log("Clic !");
});
Objets, Arrays & Async
// Objet
const user = { id: 1, nom: "Alice" };
const { nom } = user; // Destructuring
const user2 = { ...user, id: 2 }; // Spread

// Array
const arr = [1, 2, 3];
const arr2 = arr.map(n => n * 2); // [2, 4, 6]

// Promise (fetch)
fetch(url)
  .then(res => res.json())
  .then(data => console.log(data))
  .catch(err => console.error(err));

// Async/Await
async function getData() {
  try {
    const res = await fetch(url);
    const data = await res.json();
    console.log(data);
  } catch (err) {
    console.error(err);
  }
}