đ JavaScript â Le Langage du Web
Guide dense : Types, DOM, this, class, Promises, async/await & AJAX (fetch).
Vue d'ensemble
Interprété (JIT), Moteur V8, Single-Thread, Non-bloquant.
Interprété V8Intégration & Console
Balise <script>, async, defer, console.log().
Variables & Scope
var (global), let (bloc), const (bloc). Hoisting.
Types & Coercion
Typage dynamique, === vs ==, typeof, Truthy/Falsy.
Opérateurs
Arithmétique (+, %), Comparaison (===), Logique (&&, ||), Ternaire (?).
Instructions (ContrĂŽle)
Flux de contrĂŽle : if/else, switch, Boucles (for, while).
Compatibilité & Moteurs
Moteurs (V8, SpiderMonkey), MDN, Can I Use, Polyfills, Transpilers (Babel).
Can I Use BabelFonctions
Déclaration, Expression, Arrow (=>), ParamÚtres (défaut, rest).
Closures (Fermetures)
Une fonction se souvient de son scope lexical (pĂšre).
Closure ScopeLe mot-clé this
Contexte d'exécution. .bind(), .call(), .apply(). this lexical (=>).
Arrays (Méthodes)
.map(), .filter(), .reduce(), .forEach(). (Immutabilité).
OOP : Prototypes
Héritage prototypal (__proto__), Object.create(), .prototype.
OOP : class (ES6)
Sucre syntaxique. constructor, extends, super().
ES6+ (Syntaxe)
Destructuring ({...}, [...]), Spread (...), Rest (...).
Gestion des Erreurs
try...catch...finally, throw new Error().
Le DOM (Sélection)
document, getElementById, querySelector.
DOM (Manipulation)
createElement, append, .innerHTML, .style, .classList.
ĂvĂ©nements
addEventListener ('click', ...), objet event, preventDefault.
Event Loop & Callbacks
Call Stack, Web APIs, Callback Queue. "Callback Hell".
Event Loop CallbackAsynchrone : Promises
.then(), .catch(), .finally(), Promise.all().
Asynchrone : async/await
Sucre syntaxique pour les Promises. try/catch.
đĄ AJAX (fetch / XHR)
fetch() (moderne), XMLHttpRequest (ancien).
Modules (ESM)
Syntaxe import et export (ES6) pour scinder le code.
ĂcosystĂšme (Node.js & npm)
Runtime JS cÎté serveur (Node) et gestionnaire de paquets (npm).
Node.js npmFrameworks & Librairies
Outils pour UI: React, Vue.js, Angular, Svelte. DOM Virtuel.
React Vue.jsQu'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)
<script>) & ConsoleChargement (<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" }]);
let, const, var) & ScopeDepuis 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) |
let | Bloc {...} | Oui | Non (Temporal Dead Zone) |
var (Legacy) | Fonction (ou Global) | Oui | Oui (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
===)Types (Primitifs vs Objets)
7 Types Primitifs (passés par valeur) :
string,number,booleannull,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.
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)
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"
}
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);
};
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]
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
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'Appel | Valeur 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"
});
}
};
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
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__)
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 !"
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);
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é !");
}
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);
});
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();
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.");
});
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)
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).");
});
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 fonctionasync. 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");
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');
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();
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
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).
Hello {{ nom }}!
- 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é.
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);
}
}
