JavaScript a considérablement évolué depuis ES6 (ECMAScript 2015). Comprendre ces nouvelles fonctionnalités est essentiel pour travailler avec les frameworks modernes comme React, Vue ou Angular. Cet article vous guidera à travers les trois piliers du JavaScript moderne.
1. Variables : let, const, et la fin de var
Pourquoi éviter var ?
// ❌ Problème avec var : hoisting et scope de fonction
function exempleVar() {
console.log(count); // undefined (pas d'erreur!)
var count = 5;
if (true) {
var count = 10; // Même variable!
console.log(count); // 10
}
console.log(count); // 10 (modifié dans le if)
}
Utilisez let pour les variables mutables
// ✅ let : block scope et pas de hoisting
function exempleLet() {
// console.log(count); // ReferenceError!
let count = 5;
if (true) {
let count = 10; // Variable différente
console.log(count); // 10
}
console.log(count); // 5 (non affecté)
}
Utilisez const pour les constantes
// ✅ const : impossible de réassigner
const API_URL = 'https://api.example.com';
// API_URL = 'autre'; // TypeError!
// ⚠️ Les objets/arrays sont mutables
const user = { name: 'Alice' };
user.name = 'Bob'; // ✅ OK
user.age = 30; // ✅ OK
// user = {}; // ❌ TypeError!
const numbers = [1, 2, 3];
numbers.push(4); // ✅ OK
// numbers = []; // ❌ TypeError!
Règle d’or : Préférez const, utilisez let si nécessaire
// ✅ Bonne pratique
const maxUsers = 100;
const users = [];
let currentPage = 1;
function loadUsers() {
currentPage++; // let permet la modification
users.push(...fetchUsers(currentPage)); // const permet mutation
}
2. Fonctions fléchées (Arrow Functions)
Syntaxe de base
// Fonction traditionnelle
function add(a, b) {
return a + b;
}
// Arrow function équivalente
const add = (a, b) => {
return a + b;
};
// Return implicite (sans accolades)
const add = (a, b) => a + b;
// Un seul paramètre : parenthèses optionnelles
const square = x => x * x;
// Pas de paramètres : parenthèses obligatoires
const getRandom = () => Math.random();
// performance-test.js
const iterations = 1000000;
// Test 1: let vs const (performance identique)
console.time('let');
for (let i = 0; i < iterations; i++) {
let x = i * 2;
}
console.timeEnd('let'); // ~5ms
console.time('const');
for (let i = 0; i < iterations; i++) {
const x = i * 2;
}
console.timeEnd('const'); // ~5ms
// Test 2: Arrow function vs regular function
const regularFunc = function(x) { return x * 2; };
const arrowFunc = x => x * 2;
console.time('regular function');
for (let i = 0; i < iterations; i++) {
regularFunc(i);
}
console.timeEnd('regular function'); // ~8ms
console.time('arrow function');
for (let i = 0; i < iterations; i++) {
arrowFunc(i);
}
console.timeEnd('arrow function'); // ~7ms (légèrement plus rapide)
// Test 3: Destructuring vs propriété directe
const obj = { a: 1, b: 2, c: 3, d: 4 };
console.time('direct access');
for (let i = 0; i < iterations; i++) {
const a = obj.a;
const b = obj.b;
}
console.timeEnd('direct access'); // ~3ms
console.time('destructuring');
for (let i = 0; i < iterations; i++) {
const { a, b } = obj;
}
console.timeEnd('destructuring'); // ~4ms (légèrement plus lent, négligeable)
[ ] const par défaut, let seulement si mutation nécessaire
[ ] Arrow functions pour les callbacks et méthodes courtes
[ ] Destructuring pour extraire plusieurs propriétés
[ ] Rest/spread operators au lieu de Object.assign ou Array.concat
[ ] Types TypeScript définis pour les interfaces publiques
Conclusion
Maîtriser ces trois concepts fondamentaux vous permettra d'écrire du JavaScript moderne, lisible et performant. Ces patterns sont utilisés partout dans l'écosystème React, Next.js, et tous les frameworks modernes.
Points clés à retenir
Variables : Toujours const, parfois let, jamais var
Arrow functions : Syntaxe concise + contexte this préservé
Destructuring : Code plus propre et intentions claires
Un script bash qui marche, c'est facile. Un script qui échoue proprement, nettoie derrière lui et se relit dans six mois, ça demande cinq habitudes. Voici le squelette complet.