Modern JavaScript

JavaScript Moderne (ES6+)

ES6 et les versions suivantes ont transformé JavaScript, passant d'un langage de script capricieux à un véritable plaisir à écrire. Voici les fonctionnalités que vous utiliserez quotidiennement.

intermediate15 min readUpdated 15 sept. 2026
js
// cart.js
const items = [
  { name: "Keyboard", price: 80, qty: 1 },
  { name: "Mouse", price: 40, qty: 2 },
];

const total = items
  .map(({ price, qty }) => price * qty)
  .reduce((sum, n) => sum + n, 0);

console.log(`Total: $${total}`);
Sortie
Juin 2015
Aussi connu sous le nom de
ES2015 / ES6
Depuis lors
Une version chaque année
Plus grands acquis
Scope, modules, async
Ajouts clés
Arrow, destructuring, spread
Compatibilité
Universelle dans les navigateurs modernes

Pratique

Essayez les méthodes de tableau modernes

Modifiez les nombres et regardez le total se mettre à jour.

Essayez les méthodes de tableau modernes

Modifiez les nombres et regardez le total se mettre à jour.

Pourquoi c'est important

Pourquoi le JavaScript moderne est essentiel

Moins de cérémonie

Le destructuring, les raccourcis et les template literals éliminent le code répétitif pour que l'intention prime sur le bruit syntaxique.

Une portée plus sûre

let et const, avec une portée de bloc, remplacent var, éliminant toute une classe de bugs liés au hoisting et aux variables globales accidentelles.

De vrais modules

import et export ont apporté à JavaScript un système de modules standard, rendant enfin le partage de code et le tree-shaking naturels.

Le tableau complet

Trois changements qui ont tout transformé

ES6 n'était pas seulement une nouvelle syntaxe. Cela a changé la gestion de la portée (scope), l'organisation du code et la circulation des données dans un programme.

Déclarations

let, const, arrow

La portée de bloc et les fonctions concises ont changé la manière dont le code quotidien est écrit et lu.

Manipulation des données

Destructuring, spread

L'extraction et la combinaison de valeurs sont devenues expressives plutôt que répétitives.

Composition

Modules, classes

Les modules standards et la syntaxe des classes ont facilité l'organisation et le partage de programmes plus volumineux.

ES6+ en un coup d'œil

Les fonctionnalités que vous utiliserez chaque jour

let & const

Des liaisons à portée de bloc qui rendent les variables prévisibles.

Arrow functions

Une syntaxe de fonction courte avec un this lexical, parfaite pour les callbacks.

Template literals

Chaînes multi-lignes et interpolation avec les backticks et ${}.

Destructuring

Décomposez des tableaux et des objets en variables en une seule expression.

Spread & rest

Déployez des valeurs ou collectez-les en une seule, avec les mêmes trois points.

Modules

Divisez le code en fichiers avec import et export au lieu d'utiliser des variables globales.

Un bref aperçu

Le chemin de ES5 à aujourd'hui

  1. 2009

    ES5

    Le strict mode, JSON et les méthodes de tableau comme map et filter deviennent la norme.

    09
  2. 2015

    ES6 / ES2015

    La plus grande mise à jour de l'histoire : let, const, arrows, classes, promises, modules et plus encore.

    15
  3. 2017

    async / await

    Le code asynchrone se lit enfin comme du code synchrone.

    17
  4. 2020

    Optional chaining

    ?. et ?? éliminent des tonnes de vérifications null défensives.

    20
  5. Aujourd'hui

    Versions annuelles

    Le TC39 publie une nouvelle édition du standard, rétrocompatible, chaque mois de juin.

    Aujourd'hui

Le guide complet

JavaScript Moderne (ES6+): Tout ce que vous devez savoir

Qu’est-ce que l’ES6+ ?

En juin 2015, JavaScript a reçu sa mise à jour la plus importante de son histoire. ECMAScript 2015, mieux connu sous le nom d’ES6, a introduit la portée de bloc (block scoping), les fonctions fléchées, les classes, les modules, les promesses et bien plus encore. Le comité qui maintient le langage s’est ensuite engagé à publier une nouvelle édition chaque année, et le terme « ES6+ » est devenu l’abréviation désignant l’ensemble de cette ère moderne.

Il n’est pas nécessaire d’apprendre chaque fonctionnalité. Une poignée d’entre elles représentent la vaste majorité du code écrit quotidiennement, et c’est ce que ce guide couvre. Le fil conducteur de toutes ces nouveautés est simple : exprimer son intention avec moins de cérémonie.

let et const

La fonctionnalité la plus ancienne est aussi la plus importante. var a une portée de fonction (function-scoped) et subit un hoisting qui peut surprendre. let et const ont une portée de bloc (block-scoped), elles n’existent donc qu’à l’intérieur du { } le plus proche.

// scope.js
if (true) {
  let message = "inside";
  const limit = 10;
}

// message and limit are not defined out here

const empêche la réassignation de la liaison, ce qui rend votre intention évidente : ce nom ne pointera pas vers un autre endroit. Cela ne gèle pas la valeur, donc un tableau const peut toujours être muté. Utilisez const par défaut, let lorsqu’une réassignation est nécessaire, et considérez var comme faisant partie de l’histoire.

Fonctions fléchées

Les fonctions fléchées offrent une syntaxe plus courte avec une différence de comportement majeure : elles n’ont pas leur propre this. Elles héritent de this du scope environnant, ce qui est presque toujours le comportement souhaité dans les callbacks.

// arrows.js
const add = (a, b) => a + b;

const square = (n) => {
  return n * n;
};

const names = ["Ada", "Grace", "Linus"];
const upper = names.map((name) => name.toUpperCase());

Lorsque le corps de la fonction est une expression unique, les accolades et le return peuvent être omis. Les parenthèses autour d’un paramètre unique sont facultatives. Comme les fonctions fléchées capturent this, elles sont idéales pour les gestionnaires d’événements et les méthodes de tableaux, mais peu adaptées pour les méthodes d’objets qui nécessitent leur propre this.

Template literals

Les backticks permettent de créer des chaînes de caractères sur plusieurs lignes et d’interpoler des expressions avec ${ }.

// message.js
const name = "Ada";
const role = "engineer";

const greeting = `Hello, ${name}!
You are logged in as a ${role}.`;

Les template literals supportent également les tagged templates, où une fonction reçoit séparément les parties littérales et les valeurs interpolées. Ce mécanisme est à la base de nombreuses bibliothèques de templating et de styling.

Destructuration

La destructuration permet d’extraire des valeurs d’arrays et d’objets pour les assigner à des variables, ce qui évite bien des répétitions lors de l’accès aux propriétés.

// destructure.js
const user = { name: "Ada", age: 36, city: "London" };
const { name, age, city = "Unknown" } = user;

const coords = [51.5, -0.12];
const [lat, lng] = coords;

function greet({ name }) {
  return `Hello, ${name}`;
}

Vous pouvez renommer les variables lors de la destructuration (const { name: userName } = user), définir des valeurs par défaut, ou destructurer directement dans la liste des paramètres d’une fonction — un pattern utilisé constamment avec les props React et les objets de configuration.

Spread et rest

Les trois points effectuent deux tâches complémentaires selon l’endroit où ils apparaissent.

// spread.js
const a = [1, 2, 3];
const b = [4, 5];

const combined = [...a, ...b];       // spread: expand
const copy = { ...user, age: 37 };   // shallow clone + override

function sum(...numbers) {           // rest: collect
  return numbers.reduce((t, n) => t + n, 0);
}

Le spread copie des éléments dans un nouveau tableau ou objet, ce qui constitue la base des mises à jour immuables. Le rest regroupe les arguments ou éléments restants dans un seul tableau. Ensemble, ils rendent la manipulation des collections beaucoup plus agréable.

Paramètres par défaut et raccourcis

Les fonctions peuvent déclarer des valeurs par défaut, et les littéraux d’objets peuvent utiliser des raccourcis lorsque le nom de la propriété correspond à celui d’une variable.

// config.js
function connect({ host = "localhost", port = 8080 } = {}) {
  return `${host}:${port}`;
}

const name = "Ada";
const user = { name, greet() { return `Hi, ${this.name}`; } };

Les valeurs par défaut ne sont évaluées que lorsque l’argument est undefined, ce qui correspond généralement au comportement attendu. Les propriétés et méthodes raccourcies permettent d’alléger le code faisant un usage intensif d’objets.

Optional chaining et nullish coalescing

Ces deux opérateurs, ajoutés en 2020, ont permis d’éliminer des tonnes de vérifications défensives.

// safe.js
const city = user?.address?.city;
const name = input ?? "anonymous";

user?.profile?.onLogin?.();

?. s’arrête prématurément (short-circuit) et renvoie undefined si la valeur à sa gauche est null ou undefined. ?? fournit une valeur de secours uniquement lorsque le côté gauche est null ou undefined — contrairement à ||, il ne considère pas 0, "" ou false comme des valeurs manquantes.

Méthodes d’Array

Le prototype d’Array regorge de méthodes qui décrivent l’intention plutôt que la mécanique de boucle.

// arrays.js
const products = [
  { name: "Keyboard", price: 80, inStock: true },
  { name: "Mouse", price: 40, inStock: false },
  { name: "Cable", price: 10, inStock: true },
];

const names = products.map((p) => p.name);
const cheap = products.filter((p) => p.price < 50);
const total = products.reduce((sum, p) => sum + p.price, 0);
const available = products.some((p) => p.inStock);
const allCheap = products.every((p) => p.price < 100);
const mouse = products.find((p) => p.name === "Mouse");

map transforme, filter sélectionne, reduce réduit une liste en une seule valeur, find retourne la première correspondance, et some/every testent une condition. Elles peuvent être chaînées, ne mutent pas le tableau d’origine et se lisent comme une description de ce que vous souhaitez accomplir.

Modules

Les modules ES vous permettent de répartir votre code sur plusieurs fichiers et de ne partager que les éléments de votre choix.

// math.js
export function add(a, b) {
  return a + b;
}

export const PI = 3.14159;
export default function subtract(a, b) {
  return a - b;
}
// app.js
import subtract, { add, PI } from "./math.js";

Les exports nommés peuvent être multiples par fichier et sont importés par leur nom. Un export par défaut est une valeur principale unique. Les modules possèdent leur propre portée, sont évalués une seule fois et permettent aux bundlers de supprimer le code inutilisé grâce au tree-shaking.

Classes

Les classes offrent une syntaxe claire pour le code orienté objet, s’appuyant sur le système de prototypes existant de JavaScript.

// user.js
class User {
  #secret = "hidden"; // private field

  constructor(name) {
    this.name = name;
  }

  get greeting() {
    return `Hello, ${this.name}`;
  }

  static create(name) {
    return new User(name);
  }
}

class Admin extends User {
  constructor(name) {
    super(name);
    this.role = "admin";
  }
}

extends et super gèrent l’héritage, static définit des méthodes sur la classe elle-même, et # marque les champs véritablement privés. Sous le capot, il s’agit toujours de prototypes, mais la syntaxe est beaucoup plus facile à lire.

Autres fonctionnalités à connaître

  • Map et Set pour les collections avec clés et les valeurs uniques, offrant une meilleure sémantique que les objets et tableaux classiques pour ces usages.
  • for…of pour itérer sur les tableaux, les chaînes de caractères, les maps, les sets et tout autre itérable.
  • L’exponentiation avec **, ainsi 2 ** 10 remplace Math.pow(2, 10).
  • Les itérateurs et générateurs pour les séquences paresseuses (lazy sequences), l’itération personnalisée et les fonctions pouvant être mises en pause.
  • Object.entries / fromEntries pour convertir des objets en tableaux de paires et inversement.

Bonnes pratiques

  • Utilisez const par défaut ; réservez let uniquement pour les réassignations.
  • Privilégiez les arrow functions pour les callbacks, et les fonctions classiques pour les méthodes nécessitant this.
  • Utilisez la déstructuration dans les paramètres pour rendre la structure requise explicite.
  • Utilisez l’opérateur spread pour les mises à jour immuables plutôt que de muter des données partagées.
  • Tournez-vous vers ?. et ?? avant d’écrire des guards imbriqués.
  • Privilégiez les méthodes de tableau aux boucles manuelles lors de la transformation de données.
  • Gardez vos modules concis et exportez le minimum d’interface possible.

Erreurs courantes

  • Croire que const rend un objet immuable — cela empêche seulement la réaffectation.
  • Utiliser une fonction fléchée comme méthode d’objet et perdre le contexte de this.
  • Utiliser || pour des valeurs par défaut alors que 0 ou "" sont des valeurs valides ; utilisez ??.
  • Effectuer un spread sur un seul niveau en s’attendant à obtenir un clone profond.
  • Mélanger require et import dans le même système de modules sans comprendre l’interopérabilité.
  • Chaîner trop de méthodes de tableau, rendant le pipeline illisible.

Et après ?

La syntaxe moderne est votre vocabulaire ; le DOM et le JavaScript asynchrone sont les outils pour le mettre en pratique. Une fois que les promesses et les modules vous seront familiers, la Fetch API vous permettra de transformer ces compétences en véritables applications.

Accès aux données imbriquées

L'optional chaining et la coalescence des nuls remplacent les chaînes de vérifications &&.

Préférer
const city =
  user?.address?.city ?? "Unknown";
Éviter
const city =
  user && user.address &&
  user.address.city
    ? user.address.city
    : "Unknown";

Transformation d'une liste

map et reduce expriment l'intention et évitent les variables accumulateurs manuelles.

Préférer
const names = users
  .filter((u) => u.active)
  .map((u) => u.name);
Éviter
const names = [];
for (let i = 0; i < users.length; i++) {
  if (users[i].active) {
    names.push(users[i].name);
  }
}

FAQ

Foire aux questions

Keep learning

Related topics from the roadmap.

$ commencer à apprendre

Prêt à apprendre ES6+ Features ?

Notre tutoriel interactif vous guide à travers ES6+ Features pas à pas — avec des quiz et du vrai code que vous pouvez exécuter dans le navigateur.