Chapitre 1 : Variables et Scope
const et let vs var
En JavaScript moderne, on n'utilise plus var. On utilise :
const: pour les valeurs qui ne changent pas (la majorité des cas)let: pour les valeurs qui doivent être réassignées
- snippet.javascript
// CORRECT - JavaScript moderne const API_URL = "https://example.com/api"; const user = { name: "Jean" }; let counter = 0; counter = counter + 1; // OK, let permet la réassignation // INCORRECT - éviter var var oldStyle = "ne pas utiliser";
Attention : const ne signifie pas immuable
const empêche la réassignation, pas la mutation :
- snippet.javascript
const user = { name: "Jean" }; // INTERDIT - réassignation user = { name: "Paul" }; // TypeError! // AUTORISÉ - mutation de l'objet user.name = "Paul"; // OK user.age = 30; // OK const items = [1, 2, 3]; items.push(4); // OK - le tableau est modifié items = [5, 6]; // TypeError! - réassignation interdite
Comparaison avec PHP
- snippet.php
// PHP const API_URL = "..."; // Constante (valeur primitive uniquement) $user = ["name" => "Jean"]; // Variable
- snippet.javascript
// JavaScript const API_URL = "..."; // Constante const user = { name: "Jean" }; // Aussi const! (objet)
Déstructuration
La déstructuration permet d'extraire des valeurs d'objets ou de tableaux en une seule ligne.
Déstructuration d'objets
- snippet.javascript
const user = { name: "Jean", age: 30, city: "Paris" }; // SANS déstructuration const name = user.name; const age = user.age; // AVEC déstructuration const { name, age } = user; // name = "Jean", age = 30 // Renommer une variable const { name: userName } = user; // userName = "Jean" // Valeur par défaut const { country = "France" } = user; // country = "France" (user.country n'existe pas)
Déstructuration de tableaux
- snippet.javascript
const colors = ["rouge", "vert", "bleu"]; // SANS déstructuration const first = colors[0]; const second = colors[1]; // AVEC déstructuration const [first, second] = colors; // first = "rouge", second = "vert" // Ignorer des éléments const [, , third] = colors; // third = "bleu"
Usage fréquent en React
- snippet.javascript
// useState retourne un tableau [valeur, fonction] const [count, setCount] = useState(0); // Props d'un composant const MyComponent = ({ title, onClick }) => { // title et onClick extraits des props };
Comparaison avec PHP
- snippet.php
// PHP 7.1+ ['name' => $name, 'age' => $age] = $user; [$first, $second] = $colors;
Spread Operator (...)
L'opérateur spread (...) permet d'étendre un tableau ou un objet.
Spread sur les tableaux
- snippet.javascript
const fruits = ["pomme", "poire"]; const vegetables = ["carotte", "poireau"]; // Fusionner des tableaux const food = [...fruits, ...vegetables]; // ["pomme", "poire", "carotte", "poireau"] // Copier un tableau (copie superficielle) const fruitsCopy = [...fruits]; // Ajouter des éléments const moreFruits = [...fruits, "orange", "banane"];
Spread sur les objets
- snippet.javascript
const user = { name: "Jean", age: 30 }; // Copier un objet const userCopy = { ...user }; // Fusionner/étendre un objet const userWithCity = { ...user, city: "Paris" }; // { name: "Jean", age: 30, city: "Paris" } // Écraser une propriété const updatedUser = { ...user, age: 31 }; // { name: "Jean", age: 31 }
Usage critique en React
En React, on ne modifie jamais l'état directement. On crée une nouvelle copie :
- snippet.javascript
// INCORRECT - mutation directe user.age = 31; setUser(user); // React ne détecte pas le changement! // CORRECT - nouvelle copie avec spread setUser({ ...user, age: 31 });
Comparaison avec PHP
- snippet.php
// PHP - fusion de tableaux $food = array_merge($fruits, $vegetables); $food = [...$fruits, ...$vegetables]; // PHP 7.4+ // PHP - fusion d'objets/arrays associatifs $userWithCity = array_merge($user, ['city' => 'Paris']); $userWithCity = [...$user, 'city' => 'Paris']; // PHP 8.1+
Rest Parameters (...)
Le même opérateur ... sert aussi à collecter des arguments :
- snippet.javascript
// Collecter tous les arguments restants function sum(first, ...others) { console.log(first); // 1 console.log(others); // [2, 3, 4, 5] } sum(1, 2, 3, 4, 5); // Collecter toutes les props restantes const Button = ({ label, ...otherProps }) => { return <button {...otherProps}>{label}</button>; };
Template Literals (backticks)
Les template literals permettent l'interpolation et les chaînes multi-lignes :
- snippet.javascript
const name = "Jean"; const age = 30; // Interpolation const message = `Bonjour ${name}, tu as ${age} ans`; // Expressions dans l'interpolation const info = `Dans 10 ans, tu auras ${age + 10} ans`; // Multi-lignes const html = ` <div> <h1>${name}</h1> <p>Age: ${age}</p> </div> `;
Comparaison avec PHP
- snippet.php
// PHP $message = "Bonjour $name, tu as $age ans"; $message = "Bonjour {$name}, tu as {$age} ans"; // JavaScript - attention aux backticks! const message = `Bonjour ${name}, tu as ${age} ans`;
Exercices
Exercice 1 : Déstructuration
Extraire name et email de cet objet :
- snippet.javascript
const response = { data: { user: { name: "Jean", email: "jean@example.com", role: "admin" } } }; // Votre code ici
Solution :
- snippet.javascript
const { data: { user: { name, email } } } = response; // ou en deux étapes : const { user } = response.data; const { name, email } = user;
Exercice 2 : Spread
Créer une copie de user avec city ajouté et age mis à jour :
- snippet.javascript
const user = { name: "Jean", age: 30 }; // Résultat attendu : { name: "Jean", age: 31, city: "Paris" }
Solution :
- snippet.javascript
const updatedUser = { ...user, age: 31, city: "Paris" };
Points clés à retenir
- Utilisez
constpar défaut,letuniquement si réassignation nécessaire constn'empêche pas la mutation des objets/tableaux- Déstructuration :
const { a, b } = objouconst [x, y] = arr - Spread :
{ ...obj }pour copier,{ ...obj, newProp }pour étendre - Ne jamais muter l'état en React - toujours créer une copie