SmarMaker - Documentation
Docs» 15_training:module1-javascript-es6:variables-scope

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

  1. Utilisez const par défaut, let uniquement si réassignation nécessaire
  2. const n'empêche pas la mutation des objets/tableaux
  3. Déstructuration : const { a, b } = obj ou const [x, y] = arr
  4. Spread : { ...obj } pour copier, { ...obj, newProp } pour étendre
  5. Ne jamais muter l'état en React - toujours créer une copie

← Retour au module | Chapitre suivant : Fonctions →

Previous Next

Made with ❤ by CAP-REL · SmartMaker · GNU AGPL v3+
Code source · Faire un don
SmarMaker - Documentation
Traductions de cette page:
  • Français
  • Deutsch
  • English
  • Español
  • Italiano
  • Nederlands

Table of Contents

Table des matières

  • Chapitre 1 : Variables et Scope
    • const et let vs var
      • Attention : const ne signifie pas immuable
      • Comparaison avec PHP
    • Déstructuration
      • Déstructuration d'objets
      • Déstructuration de tableaux
      • Usage fréquent en React
      • Comparaison avec PHP
    • Spread Operator (...)
      • Spread sur les tableaux
      • Spread sur les objets
      • Usage critique en React
      • Comparaison avec PHP
    • Rest Parameters (...)
    • Template Literals (backticks)
      • Comparaison avec PHP
    • Exercices
      • Exercice 1 : Déstructuration
      • Exercice 2 : Spread
    • Points clés à retenir
  • SmartAuth
  • SmartMaker - Back (PHP)
    • Mapping Dolibarr - React
  • SmartMaker - Front (React)
    • Animations de pages
    • Architecture
    • Astuces
    • Calendar
    • Composants et pages
    • Configuration du Provider
    • Debug et Logs
    • Hooks SmartCommon
    • PWA (Progressive Web App)
    • Requêtes API
    • Routage
    • SmartCommon
    • Stockage de données
    • Thèmes
    • Traductions
  • HowTo - Pas à pas - Votre première application
    • Développement PHP (back)
    • Développement React (front)
    • Première étape : Module Builder Dolibarr
    • SmartAuth
    • SmartBoot : Un "squelette" quasiment prêt à l'emploi
  • Formation SmartMaker
    • Module 1 : Fondamentaux JavaScript ES6+
      • Chapitre 1 : Variables et Scope
      • Chapitre 2 : Fonctions
      • Chapitre 3 : Programmation Asynchrone
      • Chapitre 4 : Modules ES6
    • Module 2 : Introduction à React
      • Chapitre 1 : Philosophie React
      • Chapitre 2 : JSX
      • Chapitre 3 : Composants
    • Module 3 : Hooks React Fondamentaux
      • Chapitre 1 : useState
      • Chapitre 2 : useEffect
      • Chapitre 3 : useRef
      • Chapitre 4 : useContext
    • Module 4 : React Avancé
      • Chapitre 1 : useCallback et useMemo
      • Chapitre 2 : Custom Hooks
      • Chapitre 3 : Redux et Redux Toolkit
    • Module 5 : Architecture SmartMaker
      • Chapitre 1 : Structure du projet
      • Chapitre 2 : Configuration
      • Chapitre 3 : Flux de données
    • Module 6 : SmartCommon - Composants
      • Chapitre 1 : Mise en page
      • Chapitre 2 : Navigation
      • Chapitre 3 : Formulaires
      • Chapitre 4 : Affichage
    • Module 7 : SmartCommon - Hooks
      • Chapitre 1 : useApi
      • Chapitre 2 : Gestion d'état
      • Chapitre 3 : Hooks utilitaires
    • Module 8 : Backend API (PHP)
      • Chapitre 1 : Routage
      • Chapitre 2 : Controllers
      • Chapitre 3 : Mappers
      • Extrafields et formulaires dynamiques
    • Module 9 : Intégration complète
      • Chapitre 1 : Backend
      • Chapitre 2 : Frontend
      • Chapitre 3 : Déploiement
    • Module 10 : Fonctionnalités avancées
      • Chapitre 1 : Mode offline
      • Chapitre 2 : Internationalisation (i18n)
      • Chapitre 3 : Autres fonctionnalités
    • Module 11 : Bonnes pratiques
  • Démonstration
  • Start
  • Composants et pages
  • Afficher le texte source
  • Anciennes révisions
  • Liens de retour
  • Haut de page