JavaScript - Objets, Contrôle et Nouveautés (Version Simplifiée)
3.1 Les Objets en JavaScript
Créer et utiliser un objet
Un objet est une collection de données organisées en clé: valeur.
Exemple simple :
const utilisateur = {
nom: 'Eva',
age: 25,
ville: 'Lyon',
// Une méthode (fonction dans l'objet)
sePresenter() {
return `Je suis ${this.nom} et j'ai ${this.age} ans`;
},
};
console.log(utilisateur.nom); // "Eva"
console.log(utilisateur.sePresenter()); // "Je suis Eva et j'ai 25 ans"
Propriétés avec espaces et accès dynamique
const profil = {
'date de naissance': '1999-05-15',
email: 'eva@example.com',
};
// Accès avec crochets pour les espaces
console.log(profil['date de naissance']); // "1999-05-15"
// Propriétés calculées
const cle = 'email';
console.log(profil[cle]); // "eva@example.com"
Getters et Setters (propriétés calculées)
const personne = {
nom: 'Eva',
_age: 25, // Convention : _ = propriété privée
// Getter : lire une propriété calculée
get ageEnDecennie() {
return Math.floor(this._age / 10) * 10;
},
// Setter : modifier avec validation
set email(nouvelEmail) {
if (!nouvelEmail.includes('@')) {
throw new Error('Email invalide');
}
this._email = nouvelEmail;
},
get email() {
return this._email || 'Non défini';
},
};
console.log(personne.ageEnDecennie); // 20
personne.email = 'eva@example.com';
console.log(personne.email); // "eva@example.com"
Méthodes utiles sur les objets
| Méthode | Utilité |
|---|---|
Object.keys(obj) |
Récupère toutes les clés |
Object.values(obj) |
Récupère toutes les valeurs |
Object.entries(obj) |
Récupère les paires clé-valeur |
Object.assign(dest, src) |
Fusionne des objets |
Object.hasOwn(obj, clé) |
Vérifie si une clé existe |
Exemple :
const utilisateur = { nom: 'Eva', age: 25, ville: 'Lyon' };
Object.keys(utilisateur); // ["nom", "age", "ville"]
Object.values(utilisateur); // ["Eva", 25, "Lyon"]
Object.entries(utilisateur); // [["nom", "Eva"], ["age", 25], ["ville", "Lyon"]]
// Fusionner deux objets
const complet = Object.assign({}, utilisateur, { pays: 'France' });
// { nom: "Eva", age: 25, ville: "Lyon", pays: "France" }
3.2 Les Structures de Contrôle
3.2.1 Conditions : if/else et ternaire
const age = 22;
// if/else classique
if (age < 18) {
console.log('Mineur');
} else if (age < 25) {
console.log('Jeune adulte');
} else {
console.log('Adulte');
}
// Ternaire (condition simple)
const statut = age >= 18 ? 'Majeur' : 'Mineur';
console.log(statut); // "Majeur"
3.2.2 Switch avec pattern matching
const role = 'admin';
switch (role) {
case 'admin':
console.log('Accès complet');
break;
case 'moderator':
console.log('Modération');
break;
default:
console.log('Lecture seule');
}
// Switch avancé (switch(true))
const donnee = [1, 2, 3];
switch (true) {
case typeof donnee === 'string':
console.log('Texte');
break;
case Array.isArray(donnee):
console.log(`Tableau de ${donnee.length} éléments`);
break;
case typeof donnee === 'object':
console.log('Objet');
break;
}
3.2.3 Boucles modernes
for…of (pour les valeurs)
const notes = [12, 15, 18];
for (const note of notes) {
console.log(note); // 12, 15, 18
}
for…in (pour les clés d’objets)
const utilisateur = { nom: 'Eva', age: 25 };
for (const cle in utilisateur) {
console.log(`${cle}: ${utilisateur[cle]}`);
}
while et do…while
let i = 0;
while (i < 3) {
console.log(i);
i++;
}
// do...while : exécute au moins une fois
do {
console.log('Au moins une fois');
} while (false);
3.2.4 Gestion des erreurs : try/catch/finally
Syntaxe Générale
try {
// Code à exécuter
// Peut générer une erreur
} catch (erreur) {
// Code exécuté si une erreur se produit
} finally {
// Code TOUJOURS exécuté (optionnel)
}
function diviser(a, b) {
try {
if (b === 0) {
throw new Error('Division par zéro impossible');
}
return a / b;
} catch (erreur) {
console.error('Erreur:', erreur.message);
return null;
} finally {
console.log('Opération terminée');
}
}
diviser(10, 2); // 5
diviser(10, 0); // null + message d'erreur
Diagramme de Flux
┌─────────────────────────────────────────┐
│ Appel de diviser(10, 2) │
└────────────────┬────────────────────────┘
↓
┌───────────────────┐
│ BLOC TRY │
├───────────────────┤
│ Vérifier b === 0? │
│ NON → Pas d'erreur│
│ Calculer a / b │
│ return 5 │
└────────┬──────────┘
↓
┌───────────────────┐
│ BLOC CATCH │
│ (IGNORÉ) │
│ Pas d'erreur │
└────────┬──────────┘
↓
┌───────────────────┐
│ BLOC FINALLY │
│ Affiche message │
└────────┬──────────┘
↓
┌───────────────────┐
│ Retour : 5 │
└───────────────────┘
. Analyse Détaillée de Chaque Bloc**
A. Le Bloc TRY
try {
if (b === 0) {
throw new Error('Division par zéro impossible');
}
return a / b;
}
Rôle : Contient le code qui peut générer une erreur.
Étape 1 : Vérification de la Condition
if (b === 0) {
throw new Error('Division par zéro impossible');
}
| Condition | Action |
|---|---|
b === 0 |
Lance une erreur |
b !== 0 |
Continue l’exécution |
Étape 2 : Lancer une Erreur avec throw
throw new Error('Division par zéro impossible');
Signification :
throw: Lance (lance) une exceptionnew Error(...): Crée un objet erreur- Le message :
'Division par zéro impossible'
Analogie :
Sans throw :
┌─────────────────┐
│ Code continue │
└─────────────────┘
Avec throw :
┌─────────────────┐
│ ARRÊT ! │
│ Erreur lancée │
│ Saute au catch │
└─────────────────┘
Étape 3 : Calcul Normal
return a / b;
Si b !== 0, le calcul se fait normalement et retourne le résultat.
B. Le Bloc CATCH
catch (erreur) {
console.error('Erreur:', erreur.message);
return null;
}
Rôle : S’exécute UNIQUEMENT si une erreur est lancée dans le bloc try.
Paramètre erreur
catch (erreur) {
// erreur est un objet Error
}
Propriétés de l’objet erreur :
| Propriété | Contenu | Exemple |
|---|---|---|
erreur.message |
Le message d’erreur | 'Division par zéro impossible' |
erreur.name |
Type d’erreur | 'Error' |
erreur.stack |
Pile d’appels | Trace complète |
Affichage de l’Erreur
console.error('Erreur:', erreur.message);
Résultat :
Erreur: Division par zéro impossible
Retour de null
return null;
En cas d’erreur, la fonction retourne null au lieu d’une valeur numérique.
C. Le Bloc FINALLY
finally {
console.log('Opération terminée');
}
Rôle : S’exécute TOUJOURS, qu’il y ait erreur ou non.
Cas 1 : Pas d’erreur
try → Succès → finally → Retour
Cas 2 : Avec erreur
try → Erreur → catch → finally → Retour
Important : Le finally s’exécute AVANT le return.
4. Exécution Pas à Pas
Exemple 1 : diviser(10, 2)
diviser(10, 2);
Flux d’exécution :
1. Appel : diviser(10, 2)
a = 10, b = 2
2. Bloc TRY
├─ Vérifier : b === 0 ?
│ └─ 2 === 0 ? NON
├─ Pas d'erreur lancée
├─ Calculer : 10 / 2 = 5
└─ return 5
3. Bloc CATCH
└─ IGNORÉ (pas d'erreur)
4. Bloc FINALLY
└─ console.log('Opération terminée')
Affiche : "Opération terminée"
5. Retour : 5
Sortie Console :
Opération terminée
5
Exemple 2 : diviser(10, 0)
diviser(10, 0);
Flux d’exécution :
1. Appel : diviser(10, 0)
a = 10, b = 0
2. Bloc TRY
├─ Vérifier : b === 0 ?
│ └─ 0 === 0 ? OUI
├─ Lancer erreur :
│ throw new Error('Division par zéro impossible')
└─ ARRÊT du bloc try
Saute directement au catch
3. Bloc CATCH
├─ Attraper l'erreur
├─ erreur.message = 'Division par zéro impossible'
├─ console.error('Erreur:', erreur.message)
│ Affiche : "Erreur: Division par zéro impossible"
└─ return null
4. Bloc FINALLY
└─ console.log('Opération terminée')
Affiche : "Opération terminée"
5. Retour : null
Sortie Console :
Erreur: Division par zéro impossible
Opération terminée
null
5. Tableau Comparatif des Deux Appels
| Aspect | diviser(10, 2) |
diviser(10, 0) |
|---|---|---|
| Bloc TRY | Exécuté complètement | Exécuté jusqu’à throw |
| Condition | b === 0 → Faux |
b === 0 → Vrai |
| Erreur lancée | Non | Oui |
| Bloc CATCH | Ignoré | Exécuté |
| Bloc FINALLY | Exécuté | Exécuté |
| Message d’erreur | Aucun | “Division par zéro impossible” |
| Retour | 5 |
null |
6. Objet Error en Détail
Création d’une Erreur
throw new Error('Division par zéro impossible');
Structure de l’Objet Error
{
name: 'Error',
message: 'Division par zéro impossible',
stack: 'Error: Division par zéro impossible\n at diviser ...'
}
Types d’Erreurs Prédéfinis
| Type | Exemple | Quand |
|---|---|---|
Error |
new Error('message') |
Erreur générique |
TypeError |
new TypeError('message') |
Type incorrect |
RangeError |
new RangeError('message') |
Valeur hors limites |
SyntaxError |
new SyntaxError('message') |
Erreur de syntaxe |
ReferenceError |
new ReferenceError('message') |
Variable non définie |
3.3 Template Literals
Utilisation basique
const nom = 'Eva';
const age = 25;
// Avec variables
const message = `Bonjour ${nom}, tu as ${age} ans`;
console.log(message);
// Multilignes
const html = `
<div>
<h2>${nom}</h2>
<p>Âge: ${age}</p>
</div>
`;
// Expressions
const texte = `Résultat: ${10 + 5}`;
console.log(texte); // "Résultat: 15"
3.4 Nouveautés JavaScript 2025-2026
Nouvelles méthodes de tableau (immuables)
Ces méthodes créent une copie au lieu de modifier le tableau original.
const nombres = [1, 2, 3, 4, 5];
// toSorted() : trier sans modifier l'original
const trie = nombres.toSorted((a, b) => b - a);
console.log(nombres); // [1, 2, 3, 4, 5] (inchangé)
console.log(trie); // [5, 4, 3, 2, 1]
// toReversed() : inverser
const inverse = nombres.toReversed();
console.log(inverse); // [5, 4, 3, 2, 1]
// with() : modifier un élément
const modifie = nombres.with(2, 999);
console.log(modifie); // [1, 2, 999, 4, 5]
Grouper des données : Object.groupBy()
const produits = [
{ nom: 'iPhone', type: 'electronique' },
{ nom: 'Pomme', type: 'alimentaire' },
{ nom: 'MacBook', type: 'electronique' },
{ nom: 'Banane', type: 'alimentaire' },
];
// Grouper par type
const groupes = Object.groupBy(produits, (p) => p.type);
console.log(groupes.electronique);
// [{ nom: "iPhone", type: "electronique" }, { nom: "MacBook", type: "electronique" }]
console.log(groupes.alimentaire);
// [{ nom: "Pomme", type: "alimentaire" }, { nom: "Banane", type: "alimentaire" }]
🎯 Points clés à retenir
| Concept | À savoir |
|---|---|
| Objets | Clé-valeur, getters/setters, Object.keys/values/entries |
| Conditions | if/else, ternaire, switch(true) |
| Boucles | for…of (valeurs), for…in (clés) |
| Erreurs | try/catch/finally, throw new Error() |
| Templates | `texte ${variable}` |
| Immuabilité | toSorted(), toReversed(), with() |
| Groupage | Object.groupBy() pour organiser les données |
Prêt à passer à la suite ?
Vous avez terminé cette leçon sur JavaScript - Objets, Contrôle et Nouveautés (Version Simplifiée). Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.